C编程fprintf问题

C编程fprintf问题,c,printf,C,Printf,我在文本上写文件时遇到问题。如您所见,我使用\n将另一组数据放在下一行。问题是当我关闭文件并再次保存以\n结尾的每行数据时,会变成\n\n,依此类推。这就是为什么我的文件看起来像这样 第一次保存 test, test, test test, test, test 第二次保存 test, test, test test, test, test 第三次扑救 test, test, test test, test, test 这就是为什么当我在屏幕上显示它时。。。在这两者之间有垃圾

我在文本上写文件时遇到问题。如您所见,我使用
\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);  
     }                   
}
save(){
int i=0;
文件*stream=NULL;
stream=fopen(“student.txt”、“wt”);
printf(“\n正在保存学生名单目录。请稍等…”);
printf(“\n正在启动程序…”);
for(i=0;istudentID,数组[i]->name,数组[i]->course);
}                   
}

请帮忙。。。如有任何建议,将不胜感激。提前谢谢。

我猜这是在windows上的--请更改您的线路:

stream = fopen("student.txt", "wt");
致:

而且您不会得到额外的
\r
s


或者,您正在打印的最后一个字符串的末尾可能已经有了一个换行符。

我猜您的
数组[I]->course
字段包含上次保存时写入的\n。检查填充数组的代码,确保它跳过换行符。

不确定您到底做了什么,但如果在再次保存之前重新解析文件,可能您忘记了从原始的最后一个字符串中删除旧的
\n

编辑:这实际上是对的。OP使用
fgets
函数,该函数包括行终止符

因此,从“test,test,test\n”和
strtok
开始,他将获得“test”“test”“test\n”,以便在将其保存回文件时,将新的换行符(忘记它)添加到文件中

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

linebuffer[strlen(linebuffer)-2] = '\0'
(这是安全的,因为fgets本身返回以null结尾的字符串)

您还可以将
\n
添加到使用的分隔符中,您应该会得到相同的行为(不确定strtok是否为空令牌,但IIRC它们刚刚被丢弃)。

此处:

fgets(linebuffer, 45, stream);
linebuffer
中删除尾随的
\n
,如果有:

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

array[i]>课程中有什么?它的结尾有新行吗?
数组[i]->studentID中有什么?它的开头有换行符吗?你的
array[i]->course
很可能有另一个换行符终止符。提示:
fgets()
与换行符一起读取整行。你到底是如何“重新保存”文件的?他已经承认了这一点—“问题是当我关闭文件并再次保存时,文件\n会变成\n\n等等。”@DMan:你认为他是如何做到的?@Jack你为什么把它从linebuffer[strlen(linebuffer)-1]='\0'改为linebuffer[strlen(linebuffer)-2]='\0'。你能解释一下吗。。谢谢。1)
strlen-1
必须删除,2)
呢?`这不是因为修饰符。stream=fopen(“student.txt”,“wb”);没用。。怎么做?如何确保它跳过换行符???有没有这个函数,或者我需要自己写?
for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0');