首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取文本文件时出错;每一行读取两次,每一行都有额外的中断行。

读取文本文件时出错;每一行读取两次,每一行都有额外的中断行。
EN

Stack Overflow用户
提问于 2013-09-28 02:17:52
回答 2查看 511关注 0票数 1

我正在读取一个文本文件(写在UNIX或Linux机器上),它应该在每一行上有一个条目。当我用我的程序读取它并将文件内容输出到控制台时,每个其他条目都有一个额外的行中断,并且每一行重复两次。这是代码

代码语言:javascript
运行
复制
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);

因此,如果输入文件包含

代码语言:javascript
运行
复制
apple
banana
orange
zucchini
cucumber
eggplant

程序会将它显示为

代码语言:javascript
运行
复制
apple

apple
banana

banana
orange

orange
zucchini

zucchini
cucumber

cucumber
eggplant
eggplant

我不知道是怎么回事。在再次使用它之前,我必须有多清楚的sline吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-28 02:23:35

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

fgets捕获换行符\nputs自己附加一个'\n',因此在第一个打印输出之后有一个额外的行中断。

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

若要解决此问题,请先停止调用打印函数之一。接下来,确保读到的行末尾没有\n。你可以自己脱下它,或者用

代码语言:javascript
运行
复制
while (fscanf(fulllist, "%20s", sline) == 1) {
    ...
}

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

代码语言:javascript
运行
复制
printf("%s\n", sline);
票数 3
EN

Stack Overflow用户

发布于 2013-09-28 02:21:46

你觉得这有什么用?

代码语言:javascript
运行
复制
puts(sline);
printf(sline);

第一个打印行(后面是换行符!)。第二个打印行,但以%开头的任何内容都以特殊方式设置格式。因此,puts()给出了额外的换行符,但是printf()更糟糕--查找文档,并考虑如果文件中包含"%s“或"%d”会发生什么。

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

顺便提一下,一些建议:使用C来处理文本文件对您(作为C的新手)来说将是相当痛苦的。我建议使用其他一些语言,如Python、Ruby、awk、sed或其他基于您的需求和经验的语言。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19062509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档