ערכתי לאחרונה בתאריך 21.11.09 בשעה 17:24 בברכה, ronen333
זו השאלה:

עכשיו עשיתי את השאלה ככה (תוך קיצוץ תכונות מיותרות כדי להקל על הקריאות).
יש כמה בעיות בתוכנית שאני לא מבין ממה הן נובעות אבל לפני שאני מציג לכם אתת הבעיות קודם תראו את התוכנית בגדול כדי שיהיה ברור על מה אני מדבר:
#include <stdio.h> typedef enum{FALSE,TRUE}boolian; typedef char string[30]; typedef struct { string name; int cita; boolian state; }student; int main(void) { student stu; FILE *fp,*fp2; int not_over=1; fp=fopen("Students.dat","w+t"); while(not_over) { printf("name:\n"); scanf("%s",stu.name); printf("class:\n"); scanf("%d",&stu.cita); printf("\n"); stu.state=TRUE; //write to students fwrite(&stu,sizeof(student),1,fp); printf("\nput 0 to end it:\n"); scanf("%d",% not_over); } printf("-------------------\n before scaning \n -------------------\n"); fseek(fp,0,SEEK_SET); while(!feof(fp)) { fread(&stu,sizeof(student),1,fp); printf("name: %s\n",stu.name); printf("class: %d\n",stu.cita); printf("state: %d\n",stu.state); } fclose(fp); printf("-------------------\n after scaning \n -------------------\n"); fp=fopen("Students.dat","r+t"); fp2=fopen("Bogrim.dat","w+t"); while(!feof(fp)) { fread(&stu,sizeof(student),1,fp); if(stu.cita>=2) { stu.state=FALSE; fseek(fp,-1 * sizeof(student),SEEK_CUR); fwrite(&stu,sizeof(student),1,fp); fwrite(&stu,sizeof(student),1,fp2); } } printf("-------------------\n students.dat \n -------------------\n"); fseek(fp,0,SEEK_SET); while(!feof(fp)) { fread(&stu,sizeof(student),1,fp); printf("name: %s\n",stu.name); printf("class: %d\n",stu.cita); printf("state: %d\n",stu.state); } printf("-------------------\n bogrim.dat \n -------------------\n"); fseek(fp2,0,SEEK_SET); while(!feof(fp2)) { fread(&stu,sizeof(student),1,fp2); printf("name: %s\n",stu.name); printf("class: %d\n",stu.cita); printf("state: %d\n",stu.state); } fclose(fp); fclose(fp2); return 0; }
|
אז, ככה הבעיות הן אלו:
למה שאני מדפיס את מה שכתבתי בקובץ STUDENTS בהתחלה זה מדפיס לי פעמיים את הרשומה האחרונה?
מדובר על השורות האלה:
printf("-------------------\n before scaning \n -------------------\n"); fseek(fp,0,SEEK_SET); while(!feof(fp)) { fread(&stu,sizeof(student),1,fp); printf("name: %s\n",stu.name); printf("class: %d\n",stu.cita); printf("state: %d\n",stu.state); }
|
בעיה שניה:
בחלק של הסריקה כדי לעדכן את הסטודנטים שהם ביב' ללא פעילים ולהשים אותם בקובץ BUGRIM אני קורא מהקובץ בודק אם אותו סטודנט בכיתה 2 (החלטתי שרירותית שזה מסמל יב') ושינתי את הסטטוס שלו ללא פעיל ורציתי לעדכן את הרשומה בקובץ STUDENTS. בגלל שלאחר FREAD המצביע מתקדם הייתי צריך להגיד לו "לך אחורה" וכתוב עליו. משום מה נוצר לי לולאה אינסופית.. לא מוצא הסבר לתופעה.
מדובר על השורות קוד האלה:
printf("-------------------\n after scaning \n -------------------\n"); fp=fopen("Students.dat","r+t"); fp2=fopen("Bogrim.dat","w+t"); while(!feof(fp)) { fread(&stu,sizeof(student),1,fp); if(stu.cita>=2) { stu.state=FALSE; fseek(fp,-1 * sizeof(student),SEEK_CUR); fwrite(&stu,sizeof(student),1,fp); fwrite(&stu,sizeof(student),1,fp2); } }
|
אחר כך שוב אני מדפיס כדי לבדוק שהכל קשורה.. אבל זה לא מגיע לשם כי זה נתקע בלולאה שהצגתי להעיל.
יש לי מבחן ביום שני והנושא הזה כלול בו, לכן אני חייב עזרה דחוף!!!
תודה רבה לעוזרים

