当我开始重新插入文件内容并保存新文件时,我的c程序中出现了这个问题。它在while循环中失败了,我不明白如果我有一些内容要重新插入,它为什么会这样做。
这是我的代码:">
void init(){
char pn[30],pd[30],pp[30];
if ((flptr = fopen("MASTER.dat","r+")) == NULL) {
printf("Couldnt Get Cred");
return;
}
fscanf(flptr,"%s %s %s",pn,pd,pp);
while(!feof(flptr)){
r = (struct Records *) malloc(sizeof(struct Records));
int fr = fscanf(flptr,"%s %s %f",r->PartNum,r->PartDesc, &r->PartPrice);
if(fr == EOF){
printf("HERE");
break;
}
if(head == NULL){
head = r;
}
else{
tail->next = r;
}
tail = r;
}
fclose(flptr);
}
void put(){
if ((flptr = fopen("MASTER.dat","r")) == NULL) {
printf("Couldnt Get Cred");
return;
}
r = head;
fprintf(flptr,"PartNumber PartDescription PartPricen");
while (r != NULL){
fprintf(flptr,"%s %s %fn", r->PartNum, r->PartDesc, r->PartPrice);
r = r->next;
}
fprintf(flptr,"Changes SAVED.");
fclose(flptr);
}
在函数put中,您打开文件是为了读取它,而不是写入它,因此您的fprintf将无效,甚至无法创建文件
if ((flptr = fopen("MASTER.dat","r")) == NULL) {
必须是
if ((flptr = fopen("MASTER.dat","w")) == NULL) {
如果稍后您尝试使用init读取不存在的文件,则不会成功
除了put和init使用全局变量r并对其进行修改外,我鼓励您使用局部变量来避免可能出现的问题
为什么在init中打开带有"r+"的文件,而只读取它?
当你通过(f(scanf读取字符串时,我鼓励你限制长度,不要用未定义的行为写出接收器,并始终检查结果,例如更换
fscanf(flptr,"%s %s %s",pn,pd,pp);
通过
if (fscanf(flptr,"%29s %29s %29s",pn,pd,pp) != 3) {
printf("invalid file containn");
return;
}