【问题标题】:fgets not working properlyfgets 无法正常工作
【发布时间】:2015-04-18 14:00:37
【问题描述】:

我想了解 fgets 的工作原理。为此,我编写了在每一行之前打印“hi”的代码,这将使用 fgets 从另一个名为 input.txt 的文本文件中打印出来。

但它在连续行之间显示 2 his 而不是 1。我不明白为什么?

我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char singleline[150];//storing each line of input.txt as singleline arrays.
    FILE *fp;//file pointer named fp.
    fp=fopen("input.txt","r");//reading the text file input.txt
    while (!feof(fp)){
        fgets(singleline,150,fp);
        printf("hi\n");// to check that before each line hi is printed?
        puts(singleline);
    }

    return 0;
}

我的文本文件

rohit sharma,batsman,1,35.0,40.0,2200,20,95  
viru,batsman,2,28.0,45.0,1800,02,75   
suresh raina,batsman,3,38.0,35.0,2300,15,98  
suryaky,batsman,4,30.0,0.0,500,0,10   
abd,batsman,5,37.2,0.0,1200,0,50
dhoni,batsman,6,45.2,0.0,2100,0,85  
albie,allrounder,7,24.87,27.65,945,80,86  
ashwin,bowler,8,8.82,24.37,150,82,85  
naraine,bowler,9,6.67,16.94,40,67,49  
johnson,bowler,10,12.25,21.33,98,45,33  
starc,bowler,11,14.17,28.71,85,14,14

输出

hi   
rohit sharma,batsman,1,35.0,40.0,2200,20,95   

hi
hi  
viru,batsman,2,28.0,45.0,1800,02,75   
(till the end)  
johnson,bowler,10,12.25,21.33,98,45,33  

hi 
hi  
starc,bowler,11,14.17,28.71,85,14,14

这里有什么错误?

【问题讨论】:

  • 这是准确的输出吗?还有while (!feof(fp)) is always wrong。此外,您不检查 fopen() 是否成功,这显然没有发生,因为正在读取某些内容,但忽略这一点是个坏主意,除此之外,我无法相信鉴于您的输入文件,输出是你发布的那个。
  • 我刚刚检查过 - fgets() 工作正常

标签: c string io file-handling fgets


【解决方案1】:

您发布的内容:

hi
rohit sharma,batsman,1,35.0,40.0,2200,20,95  

hi
viru,batsman,2,28.0,45.0,1800,02,75  

正如预期的那样,因为你不吃尾随的换行符。您可以通过在读入singleline 后添加这一行来做到这一点。

if(strlen(singleline) != 0) // because you may have an empty file
  singleline[strlen(singleline) - 1] = '\0';

你也可以像alk建议的那样做:

singleline[strcspn(singleline, "\n")] = 0;

取自this答案。

还有feof()在while循环的控制语句中让我把你重定向到这个问题:Why is while ( !feof (file) ) always wrong?

感谢 alk 和 iharob 提供有用的 cmets。

【讨论】:

  • 这不起作用,因为 strlen 本身依赖于空终止符!
  • @d3l "strlen 本身依赖于空终止符" 这是正确的,但是有一个 0-terminator。
  • strlen() - 1 是危险的,因为不能确保传递给strlen() 的参数不引用0-length“字符串”。
  • 哦,是的,它的puts() 不是fputs(),我的错。后者不附加换行符。
  • 这里有一种节省且非常优雅的方式来切断任何类型的换行符:stackoverflow.com/a/28462221/694576
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
  • 2017-04-20
相关资源
最近更新 更多