程序應根據員工ID修改或刪除特定記錄,修改部分將修改後的記錄作爲新文件寫入文件末尾,刪除部分只工作一次,然後給我一個分段錯誤。編輯/修改和刪除從隨機訪問文件中的記錄C
修改:
我如何可以修改代碼改寫編輯的記錄在同一位置?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
struct record_em{
int id;
char name[20];
int salary;
int age;
};
int main(void)
{
struct record_em employee;
FILE *fp;
int n;
int ch;
fp = fopen("empRecord.dat","rb+");
printf("Enter Id Number:\n");
scanf("%d",&n);
rewind(fp);
while (!feof(fp)){
fscanf(fp,"%d %s %d %d", &employee.id, employee.name, &employee.salary, &employee.age);
if (employee.id==n){
printf("%d %s %d %d \n",employee.id, employee.name, employee.salary,employee.age);
printf("\n Do you want to change the name ?\n");
scanf("%d",&ch);
if (ch==1){
printf("Enter new name:\n");
scanf("%s",employee.name);
}
printf("\n Do you want to change the salary ?(y/n)\n");
scanf("%d",&ch);
if (ch==2){
printf("Enter new salary:\n");
scanf("%d",&employee.salary);
}
printf("\n Do you want to change the age ?(y/n)\n");
scanf("%d",&ch);
if (ch==3){
printf("Enter new age:\n");
scanf("%d",&employee.age);
}
fseek(fp,-sizeof(employee),SEEK_CUR);
fprintf(fp, "%d %s %d %d\n", employee.id, employee.name, employee.salary, employee.age);
exit(0);
}
}
printf("Record Not Found \n");
return 0;
}
刪除:
我如何修改代碼,使其刪除記錄,因爲我想盡可能多的時間?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
struct record_em{
int id;
char name[20];
int salary;
int age;
};
int main()
{
struct record_em employee;
FILE *fp, *ft;
int n;
fp = fopen("empRecord.dat","r");
ft = fopen("Temp.dat","wb+");
printf("\nEnter ID of employee to delete ");
scanf("%d",&n);
rewind(fp);
while (!feof(fp)){
fscanf(fp,"%d %s %d %d", &employee.id, employee.name, &employee.salary, &employee.age);
if(employee.id!=n){
fprintf(ft, "%d %s %d %d\n", employee.id, employee.name, employee.salary, employee.age);
}
}
fclose(fp);
fclose(ft);
remove("empRecord.dat");
rename("Temp.dat","EempRecord.dat");
return 0;
}
您可以保存信息塊的偏移量並覆蓋該偏移量的更改數據。請檢查fseek()。 –
@tAmirNaghizadeh Um。不,他不能。這個記錄定義雖然固定在他的代碼的「struct」中,但是由於他將它寫入磁盤(因爲它是文本翻譯)而不同。使字符串表示*這些字段中的任何*大於先前的字段,並且至少覆蓋一個後續記錄中的數據。 – WhozCraig
Right ..,由於換行符被換行符隔開,所以他可以在'getline()'報告的每一行的第一個重新編碼中使用'strcmp()'。 –