【问题标题】:Using getc to read line by line does notwork使用getc逐行读取不起作用
【发布时间】:2017-03-19 06:08:45
【问题描述】:

我需要从文件中逐行读取这是我的代码:

FILE *fp1;
    char c;
    int n = 500;
    int counter = 0 ;
    char *buffer;
    buffer = (char*) realloc(buffer, n);
    strcpy(buffer, "");
    fp1 = fopen("text.txt","r");

    if(fp1 == NULL)
    {
        perror("Error in opening file");
        return;
    }

 do
    {
        c = fgetc(fp1);
//My specification .. stop reading if you read E
        if( c == 'E' )
        {
            break ;
        }
        if (c == '\n') {
            printf("%s\n", buffer);
            counter=0;
            strcpy(buffer, "");
        }
        else{
            counter++;
/*handling overflow*/
            if (counter > n) {
                n+=100;
                buffer = (char*) realloc(buffer, n);
            }
            strncat(buffer, &c,1);

        }
    }while(!feof (fp1));

问题是代码无法正常工作,它打印的行数比原始文本文件多。任何人都可以帮助找出原因吗?

附:我知道getc() 有替代品,但我需要使用它。

更新
我将缓冲区的初始化从原始更改为:

 char *buffer = NULL;

& 所有其他 strcpy() 到此:

 *buffer = NULL;

但仍然是同样的问题。

【问题讨论】:

  • 1) char *buffer; --> char *buffer = NULL;
  • 2) 如果count != 0,则需要在if( c == 'E' ) 的块处刷新buffer
  • 这并不重要,因为我在这里存在循环
  • c 应该是 int,而不是 char,因为 fgetc 返回 int
  • 尝试将if (counter > n) 更改为if (counter > n - 2)strncat(buffer, &c,1); 更改为buffer[counter - 1] = c; buffer[counter] = '\0';

标签: c io


【解决方案1】:

使用 !feof (fp1) 作为外部 while 循环条件。您没有检查文件结尾。

【讨论】:

  • 我不需要到达文件末尾,当我找到字母 E 时我会提前终止,但为了安全起见,我会这样做
  • 啊,那么 strncpy 不是 null 终止缓冲区。如果达到最大字符,strncpy 不会终止。旁注: fgetc 实际上返回一个 int 但由于您独特的 eof 条件,您在此示例中是安全的。
  • 抱歉,我没明白你的意思,我正在处理溢出,所以它不应该达到最大字符数,对吧?
  • 如果复制的字符数等于最大长度,Strncpy 将不会终止字符串。
  • 请注意while (!feof(file)) is always wrong。不要使用feof(fp1) 作为外循环条件。
【解决方案2】:
buffer = (char*)malloc(sizeof(char)* n);

我刚刚更改了您的缓冲区分配代码,保持其他一切不变。对我来说似乎工作得很好。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 2014-11-21
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多