C编程fprintf问题

3

在写文件时我遇到了问题。您可以看到,我使用了\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);  
     }                   
}

拜托了...任何建议都将不胜感激。提前感谢您。


3
array[i]->course中有什么?它的末尾有换行符吗?array[i]->studentID中有什么?它的开头有换行符吗? - James McNellis
1
很有可能你的 array[i]->course 有另一个换行符。提示:fgets() 会将整行文本与换行符一起读入。你是如何“重新保存”文件的? - ruslik
4个回答

5

我不确定你具体在做什么,但如果在保存文件之前解析文件,可能会忘记从原始的最后一个字符串中删除旧的\n

编辑:这是正确的。OP使用fgets函数,其中包括行终止符。

因此,从“test,test,test\n”开始,使用strtok将获得“test”“test”“test\n”,因此当它被保存回去时,新的换行符(请忽略)会添加到文件中。

您可以通过将最后一个字符设置为null来修复它:

linebuffer[strlen(linebuffer)-2] = '\0'

使用fgets很安全,因为它本身返回一个以null结尾的字符串。

你也可以添加\n作为分隔符,这样做应该会得到相同的行为(不确定使用strtok时是否会有空令牌,但我记得它们只是被丢弃)。


他已经认识到这个问题 - '问题在于当我关闭文件并重新保存时,文件中的 \n 变成了 \n\n 等等。' - Dominic K
@DMan:你认为他是怎么做到的? - ruslik
@Jack 你为什么把它从linebuffer[strlen(linebuffer)-1] = '\0'改成了linebuffer[strlen(linebuffer)-2] = '\0'。你能解释一下吗?谢谢。 - newbie
  1. 必须删除 strlen-1
  2. "" 怎么办?
- ruslik

3
我猜测你的array[i]->course字段包含了上一次保存时写入的换行符。检查填充数组的代码,确保它跳过换行符。

我怎样才能确保它跳过换行符?是否有相应的函数,还是需要自己编写代码实现? - newbie

3
我猜这是在Windows上 -- 请更改您的代码行为:
stream = fopen("student.txt", "wt");

to:

stream = fopen("student.txt", "wb");

同时您不会得到额外的\r

或者,也许您正在fprintf的字符串中的最后一个已经有一个换行符了。


这不是因为修饰符。 - ruslik
stream = fopen("student.txt", "wb"); 这样还是不行,怎么办? - newbie

3

这里:

fgets(linebuffer, 45, stream);

如果linebuffer末尾有一个换行符\n,请将其删除:

for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接