读取文本文件时出错;线条读取两次,并且每次都有额外的换行符

时间:2013-09-28 02:17:52

标签: c file-io

我正在阅读一个文本文件(在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的清晰度吗?

2 个答案:

答案 0 :(得分:3)

您认为这是做什么的?

puts(sline);
printf(sline);

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

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

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

答案 1 :(得分:3)

那是因为你打印每一行两次 - 一次通过put,一次通过printf。

fgets会抓取换行符\n,而puts会追加自己的'\n',因此在第一次打印输出后会有额外的换行符。

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

要解决此问题,请先停止调用其中一个打印功能。接下来,确保您阅读的行末尾没有\n。你可以自己剥掉它,或者使用

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

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

printf("%s\n", sline);