【问题标题】:Is there a bug here in the code that uses fread使用 fread 的代码中是否存在错误
【发布时间】:2011-10-02 11:50:59
【问题描述】:
int main()
{
    FILE *read_fp;
    char buffer[BUFSIZ + 1];
    int chars_read;

    memset(buffer, '\0', sizeof(buffer));
    read_fp = popen("cat popen*.c | wc -l", "r");
    if (read_fp != NULL) {
        chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
        while (chars_read > 0) {
            buffer[chars_read - 1] = '\0';
            //buffer[chars_read] = '\0';
            printf("Reading:-\n %s\n", buffer);
            chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
        }
        pclose(read_fp);
        exit(EXIT_SUCCESS);
    }
    exit(EXIT_FAILURE);
}

fread() 返回项目数 读取成功

我觉得下面这行应该改成

buffer[chars_read - 1] = '\0';

buffer[chars_read] = '\0';

我说对了吗?

【问题讨论】:

    标签: c linux ubuntu-10.04


    【解决方案1】:

    您是否要以 NULL 终止读取的字符串?如果是这样,那么是的,buffer[chars_read] = '\0'; 将是这样做的方式。

    除此之外,如果你这样做,你的循环结构会更容易理解

    do (
        chars_read = fread(....);
        if ( chars_read > 0) { 
           buffer[chars_read] = '\0';
           printf(....);
        }
    } while (chars_read > 0);
    

    或更传统的

    while ((chars_read = fread(....)) > 0) {
           buffer[chars_read] = '\0';
           printf(....);
    }
    

    【讨论】:

      【解决方案2】:

      我相信该代码旨在从wc -l 输出中删除最后的换行符,这就是为什么它写入换行符位于字符串末尾的位置。它仍然不是特别健全的代码,因为您必须在 $PATH 中有一个非常小的 BUFSIZ 或错误的 wc 才能循环,如果它确实循环然后覆盖换行符应该只发生在最后一次通过(等效且可测试,它应该检查buffer[chars_read - 1] == '\n')。

      【讨论】:

      • 仅仅因为buffer[chars_read - 1] == '\n'并不能保证这是输入的结束...
      • 真;该代码确实存在很多错误。它根本不处理多行,并且会在缓冲区中丢失一条;这确实是fgets() 的工作。
      猜你喜欢
      • 2011-12-25
      • 1970-01-01
      • 2010-11-14
      • 2017-01-03
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2018-09-11
      • 2017-08-02
      相关资源
      最近更新 更多