Logo

רד-בורד: ארכיון

ראשי > תיכנות > עזרה בקריאת נתונים מקובץ (c++)

2004-08-03 20:24 mexT
שלום לכולם. אני מנסה לכתוב תוכנית שלוקחת קובץ בשם File.dat, שבו מאוכסנים 3 פריטים לכל שורה - ניקוד, זמן, וכינוי - 10 שורות בסך הכל. לדוגמה:
166 1244 MyNickNameHere
166 1244 MyNickNameHere1
166 1244 MyNickNameHere2
166 1244 MyNickNameHere3
166 1244 MyNickNameHere4
166 1244 MyNickNameHere5
166 1244 MyNickNameHere6
166 1244 MyNickNameHere7
166 1244 MyNickNameHere8
166 1244 MyNickNameHere9

(זה יצא פה הפוך הכינוי הוא הכי ימיני והניקוד הוא הכי שמאלי)...
כאשר לניקוד ולזמן יצרתי את השלמים bsScore ו - bsFood כמתואר בתוכנית.
עבור הכינוי מערך עצמים מסוג string.
אני משתמש במהדר dev c++, וניסיתי כל דרך אפשרית אחרת אבל זה תמיד משאיר הודעת שגיאה בזיכרון או שוגה ב-File כלומר File מכיל ערך שקר ואז יש בעיה אחר כך לכתוב אל הקובץ את המידע שאספתי לתוך המשתנים של הניקוד, זמן וכינוי לתוך הקובץ מחדש לאחר שהחלפתי את אחת השורות בשלושה נתונים חדשים (ברגע שהשחקן במקרה זה משיג תוצאה שעדיפה על אחת מהתוצאות שבקובץ התוכנית אמורה להחליף את אותה תוצאה). אם תוכלו לנסות לעזור אשמח. זה ממש חשוב לי לסיום משחק שאני בונה. תודה רבה..

int bsScore[9],bsFood[9];
string Nick[9];

fstream File("file.dat",ios::in | ios::out);

File.seekg(ios::beg);



int i=0;
while(!File.eof())
{
File >> bsScore >> bsFood >> Nick; // error somewhere here;

++i;
File.ignore(255,'
');
}


bool alreadyplaced = false;
// now the score the player has reached in the game (for testing);
int score=100,food=100;
string nick = "NICK";

for(i=0; i<=9; i++)
{
if( score > bsScore )
{
if( !alreadyplaced )
{
bsScore = score;
bsFood = food ;
Nick = nick;
alreadyplaced = true;
}
}

}
for(i=0; i<=9; i++) cout << bsScore << " " << bsFood << " " << Nick << '
'
if(!File) cout << "Error Opening the File ... ";


[נערך על-ידי mexT בתאריך 2004/08/03 20:25][נערך על-ידי mexT בתאריך 2004/08/03 20:27]
2004-08-04 22:16 tttttt
בעיקרון שגיאות כאלה מתרחשות כשאתה מנסה לקרוא משתנים מתוך קובץ, אבל אתה קורא אותם לא נכון לדוגמא אם הקובץ בנוי:

tttt 66 6.5
ואתה מנסה לקרוא אותם ככה (דוגמא בשפת c)

fscanf(fp, "%d %s %f" &tr, &gf, %gf) f
ניסינו לקרוא ערכים מקובץ למשתנים לא מתאימים, הרי מצביע הקובץ רץ על הקובץ תו תו וכל פעם מתקדם באחד.

אני לא ממש מבין גדול בשפת c, אבל נראה כאן שאתה מנסה לקרוא מחרוזות לתוך מערך מחרוזות אבל שוב, אין לך ירידת שורה בקריאה, ככה שאתה מנסה לקרוא משתנים שהם לא מהסוג המתאים, וד"א גם תוו הרווח נקרא תו, ככה שפתרון לבעיה יכול להיות הוספת תוו ירידת שורה בסוף כל קריאה מקובץ.

ד"א- אתה שם את מצביע הקובץ פה בהתחלה:
File.seekg(ios::beg
??

ד"א גדול- הזחה חביבי, הזחה.... זתומרת תשתמש ב tab, לא סתם הוא שם (:
הזחה זאת אומרת סידור הקוד שיהיה נח לקריאה,
למה?


[נערך על-ידי tttttt בתאריך 2004/08/04 22:17][נערך על-ידי tttttt בתאריך 2004/08/04 22:18]
2004-08-04 22:20 tttttt
ד"א- אף פעם לא עבדתי עם קבצים בשפת c++ ואני גם מקווה לא לעבוד שמעו, כל הפונקציות שהוסיפו לה פשוט מוזרות....
2004-08-04 22:45 latrep
ד"א2 הוספה קטנה למה שאמרתי - למרות ששימוש בקבצים נראה לך די נפוץ, הוא לא הכי נפוץ והירח לא יפול אם תדלג על הנושא ותחזור אליו כשתצטרך אותו, אם תה צריך אותם לפרוייקט אז תעבור על הנושא, אבל אם אתה כותב פרוייקט קטן כדי ללמוד את השפה, לא הכי חשוב שתשתמש בקבצים..
ד"א קובץ הוא סה"כ מבנה בשם FILE (אותיות גדולות) שכולל בתוכו משתנים שכוללים שמות הקובץ, תאריכים, גודל וכו.,.
2004-08-05 15:53 mexT
tttttt: ההזחה לא ממש מתאפשרת פה בפורום.
האופרטור קלט מאפיק קובץ << נותן לך את סוג הטיפוס שאותו אתה מציב למשתנה עד לרווח הראשון ומעביר את מצביע הקובץ למילה הבאה כך שפה לא הבעיה.
עמודים: 1