为啥我的追加功能不再写入文件
Posted
技术标签:
【中文标题】为啥我的追加功能不再写入文件【英文标题】:Why does my append function no longer write to file为什么我的追加功能不再写入文件 【发布时间】:2014-11-19 14:38:21 【问题描述】:我正在为一个简单的电话簿编写代码。一切正常,除了在使用我的删除功能成功删除条目后,我的附加功能似乎无法再将条目写入文件。除非我删除用于存储条目的 database.data 文件。
注意: 字符数组 file="database.data"
删除函数:
void deletee()
int tode,count;
char ch;
printc();
count=1;
FILE *filepointer,*filepointer2;
filepointer=fopen(file,"r+");
filepointer2=fopen("datatemp.data","w+");
if(filepointer==NULL)
printf("ERROR ERROR!");
printf("Enter line number of the line to be deleted: \n");
scanf("%d",&tode);
while (ch!=EOF)
ch=getc(filepointer);
if(ch=='\n')
count++;
if(count!=tode)
fprintf(filepointer2,"%c",ch);
fclose(filepointer);
fclose(filepointer2);
remove(file);
rename("datatemp.data",file);
printf("Content successfully deleted!!");
这里是追加功能:
void append(struct entry *ptr)
FILE *filepointer;
filepointer=fopen(file,"a+");
fflush(stdin); //This block is asking for the inputs to be placed into the file
printf("Enter FName: ");
scanf("%s",&ptr->fn);
printf("\nEnter LName: ");
scanf("%s",&ptr->ln);
printf("\nEnter MName: ");
scanf("%s",&ptr->mn);
printf("\nEnter BD: ");
scanf("%s",&ptr->bd);
printf("\nEnter CNum: ");
scanf("%s",&ptr->cn);
if(filepointer==NULL)
printf("The file does not exist.\n");
return;
system("cls");
fprintf(filepointer,"%15s%15s%15s%9s%11s\n",ptr->fn,ptr->ln,ptr->mn,ptr->bd,ptr->cn);
fclose(filepointer);
printf("Entries successfully written!\n");
结构入口
char fn[15]; char ln[15]; char mn[15]; char bd[9]; char cn[11]; p;
如果您想了解更多详情,请告诉我。
更新-
我将问题缩小到 delete 函数中的 while 循环,如果 while 循环中的内容是这样编写的,我的 append 函数在使用 delete 后似乎可以工作:
while (ch!=EOF) ch=getc(filepointer); if(count!=tode) fprintf(filepointer2,"%c",ch); if(ch=='\n') count++;
但如果 while 循环以这种方式编写,它将删除指定行之后的所有条目。而在我之前的delete函数中while循环的代码中,它只删除了该特定行,但正如所述,追加函数无法写入文件的问题将持续存在,直到我手动删除文件“database.data” .
【问题讨论】:
从技术上讲,fflush(stdin)
是未定义的行为。有些系统将其作为扩展,但它不是可移植的。
你在deletee
函数中也有undefined behavior,因为你在初始化之前使用了局部变量ch
。未初始化的局部非静态变量的值是不确定的。
@JoachimPileborg 删除了 fflush(stdin) 感谢您的提示。
当你使用你的函数删除一行时,你最终会得到一个空行。您可能想要更改循环中这两个块的顺序。
最后,为了帮助您找出问题所在,当fopen
失败时,您应该打印errno
的值以查看问题所在,或者使用例如perror
或 strerrno
从错误代码中打印或获取可打印字符串。
【参考方案1】:
解决了这个问题原来附加函数能够将条目写入文件唯一的问题是我的打印函数由于删除函数在执行后留下垃圾而无法打印出新条目。修改代码,删除后不写垃圾。
void deletee()
int tode,count; char ch,sc; printc(); count=1; FILE *filepointer,*filepointer2; filepointer=fopen(file,"r+"); filepointer2=fopen("datatemp.data","w+"); if(filepointer==NULL) printf("ERROR ERROR!"); printf("Enter line number of the line to be deleted: \n"); scanf("%d",&tode); while (ch!=EOF) ch=getc(filepointer); if(count!=tode) if(ch==EOF) break; fprintf(filepointer2,"%c",ch); if(ch=='\n') count++; fclose(filepointer); fclose(filepointer2); swap(); remove("datatemp.data"); printf("Content successfully deleted!!");
【讨论】:
1) 第一次调用while (ch!=EOF)
使用ch
的未初始化值。 2) 应该使用int ch
。见***.com/a/8587031/2410359以上是关于为啥我的追加功能不再写入文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 fs.appendFile() 追加文件但不写入另一个 JSON 对象