我正在读取一个文本文件(写在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
我不确定这是在做什么。在再次使用它之前,我必须了解一下线条的清晰度吗?
这是因为您打印每行两次 - 一次通过 puts,一次通过 printf。
fgets
捕获换行符n
,puts
附加自己的'n'
,因此在第一次打印输出后有一个额外的换行符。
文件的最后一行("eggplant"
)缺少尾随'n'
,所以两个茄子打印输出之间没有多余的空白行。
若要解决此问题,请首先停止调用其中一个打印函数。接下来,确保您阅读的行末尾没有n
。您可以自己剥离它,也可以使用
while (fscanf(fulllist, "%20s", sline) == 1) {
...
}
不建议在形式参数的位置使用字符串调用printf
,因为存在意外的格式符号可能会导致未定义的行为。如果您决定使用 printf
,请按如下方式使用它:
printf("%sn", sline);
你认为这是做什么的?
puts(sline);
printf(sline);
第一个打印行(后跟换行符! 第二个打印行,但以特殊方式格式化以 % 开头的任何内容。 因此,puts()
为您提供了一个额外的换行符,但printf()
更糟糕的是 - 查找文档并考虑如果您的文件包含"%s"或"%d"会发生什么。
因此,您只想使用单个输出语句,并且不需要双换行符。 您可以在打印前从每行中删除换行符,但更好的是使用不添加换行符的fputs(sline, stdout)
。
顺便说一句,一点建议:使用 C 来处理文本文件对您来说会非常痛苦(作为 C 的新手)。 我建议使用其他语言,例如Python,Ruby,awk,sed或其他任何基于您的需求和经验的语言。