在文本上写文件时遇到问题。如您所见,我使用\n
将另一组数据放在下一行。问题是当我关闭文件并再次保存每行以\n
结束的数据变为\n\n
时依此类推。这就是为什么我的文件看起来像这个
首先保存
test, test, test
test, test, test
第二次保存
test, test, test
test, test, test
第三个保存
test, test, test
test, test, test
这就是为什么当我在屏幕上显示它...之间有垃圾值...我的代码如下:
save(){
int i = 0;
FILE *stream = NULL;
stream = fopen("student.txt", "wt");
printf("\nSaving the student list directory. Wait a moment please...");
printf("\nExiting the program...");
for (i=0; i<recordCtr; i++){
fprintf(stream, "%s, %s, %s\n", array[i]->studentID, array[i]->name, array[i]->course);
}
}
请帮助...任何建议将不胜感激。提前谢谢。
答案 0 :(得分:5)
不确定你究竟做了什么但是如果你再次保存文件之前解析文件可能你忘记从原来的最后一个字符串中删除旧的\n
..
fgets
函数,其中包括行终止符。
所以从“test,test,test \ n”开始,strtok
他将获得“test”“test”“test \ n”,这样当它被保存回新换行符时(忘了)被添加到文件中。
您可以通过使用
将最后一个字符设置为null来解决此问题linebuffer[strlen(linebuffer)-2] = '\0'
(它是安全的,因为fgets自己返回一个以null结尾的字符串)
您还可以将\n
添加到已使用的分隔符中,您应该最终使用相同的行为(不确定使用strtok的空标记但是IIRC它们只是被丢弃)。
答案 1 :(得分:3)
我猜这是在Windows上 - 改变你的行:
stream = fopen("student.txt", "wt");
为:
stream = fopen("student.txt", "wb");
你不会得到额外的\r
。
或者,也许你fprintf
的最后一个字符串在结尾处已经有了换行符。
答案 2 :(得分:3)
我猜你的array[i]->course
字段包含之前在上次保存中写入的\ n。检查填充数组的代码,并确保它正在跳过换行符。
答案 3 :(得分:3)
下面:
fgets(linebuffer, 45, stream);
如果有\n
,则从linebuffer
删除for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0');
:
{{1}}