1

我正在阅读一个文本文件(在 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

我不确定它在做什么。在再次使用它之前,我必须有一些清晰的线条吗?

4

2 回答 2

3

你认为这有什么作用?

puts(sline);
printf(sline);

第一个打印行(后跟换行符!)。第二个打印该行,但以特殊方式格式化以 % 开头的任何内容。所以puts()给了你一个额外的换行符,但printf()更糟糕的是——查看文档并考虑如果你的文件包含“%s”或“%d”会发生什么。

因此,您只想使用单个输出语句,而不需要双换行符。您可以在打印之前从每一行中删除换行符,但更好的是使用fputs(sline, stdout)不添加换行符的。

顺便说一句,一些建议:使用 C 处理文本文件对你来说会很痛苦(作为 C 的新手)。我建议根据您的需要和经验使用其他语言,例如 Python、Ruby、awk、sed 或其他任何语言。

于 2013-09-28T02:21:46.687 回答
3

那是因为您将每行打印两次——一次通过 puts,一次通过 printf。

fgets捕获 newline \n,并puts附加'\n'它自己的 a ,因此在第一次打印输出后还有一个额外的换行符。

文件 ( ) 中的最后一行"eggplant"缺少尾随'\n',因此在两个茄子打印输出之间没有额外的空白行。

要解决此问题,首先停止调用其中一个打印函数。接下来,确保您阅读的行\n末尾没有 a。您可以自己将其剥离,也可以使用

while (fscanf(fulllist, "%20s", sline) == 1) {
    ...
}

不建议printf在形式参数的位置使用您的字符串进行调用,因为那里有意外的格式符号可能会导致未定义的行为。如果您决定使用printf,请按如下方式使用:

printf("%s\n", sline);
于 2013-09-28T02:23:35.573 回答