שימוש בקבצי טקסט
הוצג| English | משמעות |
|---|---|
| text file/tekst faɪl/ | קובץ טקסט |
שורה ריקה אינה טוקן לא תקין
- קובץ טקסט מכיל שורה ריקה שלאחריה
12. בהתחלה, גםhasNextLine()וגםhasNextInt()הם נכונים: בדיקת טוקן של מספר שלם מדלגת על רווחים, כולל השורה הריקה, כדי למצוא 12. - השוו קובץ המכיל
oopsשלאחריו12: יש לו עוד שורה, אך הטוקן הבא שלו אינו מספר שלם. בדיקת נוכחות שורה אינה יכולה לקבוע פורמט של מספר שלם; בחרו מגן (guard) התואם את הקריאה.
עם המפריד הברירת מחדל, Scanner המכיל שורה ריקה שלאחריה 12 מדווח hasNextInt() כ-true בהתחלה.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
בדיקת טוקן של מספר שלם דורשת רווחים, כולל השורה הריקה, ומצאת את טוקן המספר 12.
חברו את הקורא למקור שלו
new Scanner(new File("scores.txt"))קורא את הקובץ הנקוב, בעוד שnew Scanner(System.in)קורא קלט ממקלדת. שניהם חושפים אותן שיטות Scanner; המקור והזמינות שלו שונים.- פתיחת קובץ שאינו קיים עלולה להזריק
FileNotFoundException. הדוגמה המלאה להלן מכריזה עליה בmain; אפליקציה אמיתית עשויה במקום זאת לתפוס אותה ולהציג שגיאה שימושית. שום אחד מהבחירות אינו יוצר נתונים חסרים.
כדי לקרוא קובץ טקסט, מחברים Scanner ל-...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
new Scanner(new File("...")) קורא קובץ.
אותן שיטות Scanner (nextInt, nextLine) עובדות גם לקלט מהמקלדת וגם לקלט מקובץ.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ההבדל היחיד הוא במקור (System.in לעומת File).
קראו שורות שלמות
hasNextLine()בודק האם קיימת שורה נוספת ללא צריכתה;nextLine()צורך את שארית השורה זו ואת מופר השורה שלה. שורה ריקה עשויה לייצר את המחרוזת הריקה"".- עבור רשומות מבוססות שורות, השתמשו ב
while (in.hasNextLine()) { String line = in.nextLine(); ... }. החליטו במפורש האם רשומה ריקה היא משמעותית, צריכה להימחק, או צריכה לדווח כבלתי תקינה.
קריאת קובץ טקסט
עקבו אחרי השלבים שבהם תוכנית קוראה קובץ שורה אחר שורה.
איזו שיטה בודקת אם קיים עוד שורה לקריאה?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
hasNextLine() משמש כמגן לקריאה של nextLine().
חובה לבדוק את hasNextLine() לפני כל קריאה ל-nextLine().
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ניסיון לקרוא מעבר לסוף הקובץ גורם לפליטת חריגה.
קריאת טוקנים עם בדיקות התאמה
- המפריד הרצף של Scanner הוא רווחים.
hasNext()בודק נוכחות טוקן;next()צורך אותו.hasNextInt()בודק האם הטוקן הבא ניתן לקריאה כמספר שלם;nextInt()צורך את המספר הזה. while (in.hasNextInt())עצור ב-oops, גם אם 12 נעקב. אם המדיניות היא לדלג על טוקנים לא תקפים ולשמור על שלמים מאוחרים, השתמש בלולאה עםhasNext(), בדוקhasNextInt(), ובצע טוקן לא תקין עםnext().
תוכנית מלאה זו סוכמת טוקני מספרים שלמים תקינים ומדווחת על כל טוקן שנמדד. עבור קובץ המכיל oops שלאחריו 12, היא מדפיסה Skipped: oops ולאחר מכן Total: 12. הדוגמה מניחה שהסכום נכנס לint.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadScores {
public static void main(String[] args) throws FileNotFoundException {
int total = 0;
try (Scanner in = new Scanner(new File("scores.txt"))) {
while (in.hasNext()) {
if (in.hasNextInt()) {
total += in.nextInt();
} else {
System.out.println("Skipped: " + in.next());
}
}
}
System.out.println("Total: " + total);
}
}
Match each read to the guard that checks that kind of input.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
A line-presence check is not an integer-format check.
צריכת קלט ושחרור הקובץ
- כל ענף במחזור הסימנים (token loop) צורך סימן. בדיקה חוזרת על סימן לא תקין ללא צריכתו משאירה את הסקנר באותו מיקום ועלולה לגרום למחזור להמשיך לנצח.
- בלוק try-with-resources סוגר את Scanner הקובץ הזה בעת יציאה, כולל יציאה חריגה. כאשר מנהלים זאת ידנית, יש לקרוא ל-
close()בסיום; בדיקות אינן מחליפות את סגירת המשאב.
hasNextLine() שלאחריו nextInt() אינו מגן תואם. טוקן שאינו מספר שלם עלול לגרום לInputMismatchException, וקריאת מספר שלם כושלת משאירה את הטוקן זמין. בחרו בין דחיית הקובץ, הדיווח ברשומה, או דילוג מפורש על הטוקן.
כשנגמרים לקרוא קובץ, עליך...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
in.close() משחרר את הקובץ.
בדיקת מדינת הנתונים לפני המחזור
- עבור קלט
8 oops 12, מחזור שקורא רק כשה-hasNextInt()כולל סך של 8 ונעצר ב-oops. מדינת ההדפקה והדחייה המוצגת כוללת סך של 20. סימן בלתי צפוי אינו חייב להעיד שהקובץ נסגר. - מדינות אלו משיבות על שאלות שונות. עבור ציון חובה לכל תלמיד, הדפקה שקטה על סימן פגום עשויה לשבש את התאמת הרקורדים; מומלץ לדווח ולדחות את הרקורד הזו, במקום להתייחס לכל הסימנים הבאים כציונים החלופיים זה לזה.
בחרו בין קריאת שורה או קריאת סימן מהקובץ לפי הפורמט. בדיקות בוחנות קלט מתקבל ללא צריכתו; קריאות התאמה צורכות אותו. טפל בנתונים לא תקונים במפורש, עדכן כל ענף במחזור, וסגור את קורא הקובץ.
לקלט 8 oops 12, מה הסכום שהתוכנית המוצגת מדפיסה?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
היא צורכת והוסיפה 8, צרכה ודיווחה oops, ואז צרכה והוסיפה 12. הסכום הוא 20.