C编程fprintf问题

时间:2010-12-03 04:01:32

标签: c printf

在文本上写文件时遇到问题。如您所见,我使用\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);  
     }                   
}

请帮助...任何建议将不胜感激。提前谢谢。

4 个答案:

答案 0 :(得分:5)

不确定你究竟做了什么但是如果你再次保存文件之前解析文件可能你忘记从原来的最后一个字符串中删除旧的\n ..

编辑:这实际上是正确的。 OP使用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}}