我正在读取一个文本文件(写在UNIX或Linux机器上),它应该在每一行上有一个条目。当我用我的程序读取它并将文件内容输出到控制台时,每个其他条目都有一个额外的行中断,并且每一行重复两次。这是代码
FILE* fullList;
char sline[21];
fullList = fopen("fullList", "r");
if(fullList == NULL)
exit(EXIT_FAILURE);
while(fgets(sline, sizeof(sline), fullList) != NULL)
{
puts(sline);
printf(sline);
}
fclose(fullList);
因此,如果输入文件包含
apple
banana
orange
zucchini
cucumber
eggplant
程序会将它显示为
apple
apple
banana
banana
orange
orange
zucchini
zucchini
cucumber
cucumber
eggplant
eggplant
我不知道是怎么回事。在再次使用它之前,我必须有多清楚的sline吗?
发布于 2013-09-28 02:23:35
这是因为你打印每一行两次--一次通过puts,一次通过printf。
fgets
捕获换行符\n
,puts
自己附加一个'\n'
,因此在第一个打印输出之后有一个额外的行中断。
文件中的最后一行("eggplant"
)没有尾随的'\n'
,因此在两个茄子打印之间没有额外的空行。
若要解决此问题,请先停止调用打印函数之一。接下来,确保读到的行末尾没有\n
。你可以自己脱下它,或者用
while (fscanf(fulllist, "%20s", sline) == 1) {
...
}
在形式参数的位置使用字符串调用printf
是不可取的,因为有意外的格式符号可能会导致未定义的行为。如果您决定使用printf
,请按以下方式使用:
printf("%s\n", sline);
发布于 2013-09-28 02:21:46
你觉得这有什么用?
puts(sline);
printf(sline);
第一个打印行(后面是换行符!)。第二个打印行,但以%开头的任何内容都以特殊方式设置格式。因此,puts()
给出了额外的换行符,但是printf()
更糟糕--查找文档,并考虑如果文件中包含"%s“或"%d”会发生什么。
因此,您希望只使用一个输出语句,而不需要双换行符。您可以在打印之前从每一行中删除换行符,但更好的方法是使用不添加换行符的fputs(sline, stdout)
。
顺便提一下,一些建议:使用C来处理文本文件对您(作为C的新手)来说将是相当痛苦的。我建议使用其他一些语言,如Python、Ruby、awk、sed或其他基于您的需求和经验的语言。
https://stackoverflow.com/questions/19062509
复制相似问题