1. עבודה עם קבצים
יצירת מבנה:
קבצים בנויים מבלוקים בעלי גודל, מבנה וטיפוס זהים.
ע"מ ליצור מבנה שכזה נבצע הגדרה באופן הבא לדוגמה:
typedef struct
{
;int numeric
;]char stringname[stringsize
; } ITEM
הכנסת מבנה לקובץ:
פונקצית הכנסה המקבלת מצביע לקובץ, בתוכה ניצור מבנה זמני, נבצע השמה לתוך המבנה (לדוגמה, קלט
מהמשתמש) ונכתוב את המבנה לקובץ:
)void insert (FILE* file
{
;ITEM itemname
;)scanf ("%s",itemname.stringname
;)scanf ("%d",&itemname.numeric
;)fwrite (&itemname, sizeof(ITEM), 1, file
}
חיפוש מבנה בקובץ:
פונקצית חיפוש המקבלת מצביע לקובץ, נגדיר משתנה זמני לפיו נחפש בקובץ,
היות ומיקום ה"סמן" לא ידוע וברצוננו לחפש בקובץ מתחילתו, עלינו "להריץ" את הקובץ להתחלה ולחפש משם:
)int search (FILE* file
{
;ITEM itemname
;]char stringname[stringsize
;)rewind(file
;)scanf("%s",stringname
))while (fread(&itemname, sizeof(ITEM), 1, file
{
))if (!strcmp(itemname.stringname,stringname
{
;)"printf("Item Found!n
;1 return
}
}
;)"printf("Item not Found!n
;0 return
}
2. :הסרת מבנה מקובץ
פונקצית מחיקה המקבלת מצביע לקובץ, בתחילה יש לשמור את הרשומה האחרונה בקובץ במבנה זמני, לבצע חיפוש
.של הרשומה להסרה, לכתוב עליה את הרשומה מהמבנה הזמני, ולקצר את אורך הקובץ ברשומה אחת מהסוף
int remove (FILE* file)
{
ITEM itemname,last_itemname;
char stringname[stringsize];
HANDLE filehandle; // an handle to file which can have its EOF changed.
fseek(file,-(sizeof(ITEM)),SEEK_END);
fread(&last_itemname,sizeof(ITEM),1,file);
rewind (file);
scanf("%s",stringname);
while(fread(&itemname, sizeof(ITEM), 1, file))
{
if (!strcmp(itemname.stringname,stringname))
{
fseek(file,-(sizeof(ITEM)),SEEK_CUR);
fwrite(&last_itemname,sizeof(ITEM),1,file);
fseek(file,-(sizeof(ITEM)),SEEK_END);
fclose(file);
filehandle=CreateFile(L"D:file.$$$",GENERIC_WRITE |
GENERIC_READ,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(filehandle,-sizeof(ITEM),NULL,FILE_END);
SetEndOfFile(filehandle);
CloseHandle(fliehandle);
file=fopen("D:file.$$$","rb+");
printf("Item Removed!n");
return 1;
}
}
printf("Item not Found!n");
return 0;
}
3. :עדכון הקובץ
:פונקצית עדכון המקבלת מצביע לקובץ, בעזרת פונקצית החיפוש, מוצאת את הרשומה ולבסוף מעדכנת
int update (FILE* file)
{
ITEM itemname;
rewind(file);
if(search(file))
{
fseek(file,-sizeof(ITEM),SEEK_CUR);
fread(&itemname,sizeof(ITEM),1,file);
printf("insert new numericn");
scanf("%d",&(itemname.numeric));
fseek(file,-sizeof(ITEM),SEEK_CUR);
fwrite(&itemname,sizeof(ITEM),1,file);
printf("Item Updated!n");
return 1;
}
printf("Item not Found!n");
return 0;
}
:הדפסת הקובץ
:פונקצית הדפסה המקבלת מצביע לקובץ ומדפיסה רשומה-רשומה, כל עוד לא הגיע סוף הקובץ
void print(FILE* file)
{
ITEM itemname;
rewind(file);
while (fread(&itemname, sizeof(ITEM), 1, file))
{
printf("%s %dn",itemname.stringname,itemname.numeric);
}
}
.הפרוצדורה הראשית: יצירת קובץ, קריאה לפונקציות וסגירת הקובץ
void main ()
{
FILE* file = NULL;
if (!file=fopen("D:file.$$$","wb+"))
printf("An Error Occurred!"); return;
insert(file);
search(file);
remove(file);
print(file);
update(file);
fclose(file);
}