ABA


"צריך עזרה בC | בתרגיל עם קריאה וכתיבה מקבצים"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15565 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15565
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   15:09   20.11.09   
אל הפורום  
  צריך עזרה בC | בתרגיל עם קריאה וכתיבה מקבצים  
 
   ערכתי לאחרונה בתאריך 20.11.09 בשעה 15:15 בברכה, ronen333
 
קיבלתי תרגיל בC עם קיראה וכתיבה מקבצים.. נתון סיפור ואני אמור להשלים את החלקים החסרים.
הנושא חדש לי ככה שאני ממש צולע בזה עכשיו ולצערי יש לי מבחן ביום שני כאשר החומר של הקבצים כלול שם.
לא הצלחתי למצוא מה להשים ב2 ו8.. החרא הזה ממש מבאס =/.
אשמח אם תוכלו גם לאשר לי שהתשובות שעניתי (במסגרת באדום) נכונות..

אני יודע שזה נראה ארוך.. אבל זה די קצר בבקשה תציצו על זה..


הנה השאלה:



זה די דחוף.. תודה =]


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  אייל המלך עזר לי במסנג'ר... ronen333  20.11.09 17:24 1
     האוגר המלך הכול יכול*, תודה. שמשון פישטונה 20.11.09 17:27 2
  שאלה נוספת!! ronen333  21.11.09 12:22 3
     עקבתי אחרי זה לאט לאט. וזה ביכלל לא כותב על הקובץ ronen333  21.11.09 14:52 4
     תתעלמו ממה שכתבתי. הנה מסודר יותר- ronen333  21.11.09 17:16 5

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   17:24   20.11.09   
אל הפורום  
  1. אייל המלך עזר לי במסנג'ר...  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
שמשון פישטונה

   17:27   20.11.09   
אל הפורום  
  2. האוגר המלך הכול יכול*, תודה.  
בתגובה להודעה מספר 1
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   12:22   21.11.09   
אל הפורום  
  3. שאלה נוספת!!  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 21.11.09 בשעה 12:28 בברכה, ronen333
 
ש בעיה מאוד מאוד מוזרה שנתקלתי בה. FREAD FWRITE אמורים לקדם את המצביע של הקובץ נכון? ועל מנת לעדכן רשומה לכאורה אתה צריך לקרוא אותה, לחזור אחורה ואז לכתוב עליה.
ואם אתה לא חוזר אחורה אתה בעצם דורס את הרשומה הבאה אחריה (כי FREAD קורא את הרשומה הראשונה, מקדם את המצביע ואז שאתה עושה FWRITE זה כותב על השניה).
אז למה שכתבתי את הקוד הבא:

fp=fopen("Students.dat","r+b");
fp2=fopen("Bogrim.dat","w+b");
fread(&stu,sizeof(student),1,fp);
while(!feof(fp))
{


if(stu.cita==2)
{
stu.state=FALSE;


fwrite(&stu,sizeof(student),1,fp);
fwrite(&stu,sizeof(student),1,fp2);
}
fread(&stu,sizeof(student),1,fp);
i++;
}

אני קורא מהקובץ STUDENTS ואחר כך כותב.. זה אמור לדרוס את הרשומה השניה ולא לעדכן את הראשונה....

שאני מריץ את זה זה מעדכן לי את אותה רשומה בלי צורך לחזור אחורה. מדוע זה? X=


נב-
STU הוא מבנה מטיפוס STUDENT שהגדרתי בTYPEDEF והוא מכיל תכונות (לא חשוב שמות האמת)...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:52   21.11.09   
אל הפורום  
  4. עקבתי אחרי זה לאט לאט. וזה ביכלל לא כותב על הקובץ  
בתגובה להודעה מספר 3
 
   STUDENTS!!! מה לעזעזל?!!??!
בקובץ Bogrim זה כן כותב לי עם הסטטוס המעודכן ורק ב Students לא.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   17:16   21.11.09   
אל הפורום  
  5. תתעלמו ממה שכתבתי. הנה מסודר יותר-  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 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);
}
}


אחר כך שוב אני מדפיס כדי לבדוק שהכל קשורה.. אבל זה לא מגיע לשם כי זה נתקע בלולאה שהצגתי להעיל.

יש לי מבחן ביום שני והנושא הזה כלול בו, לכן אני חייב עזרה דחוף!!!
תודה רבה לעוזרים


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net