在使用fread的代码中是否存在错误

时间:2011-07-11 03:21:37

标签: c linux ubuntu-10.04

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';

我能做对吗?

2 个答案:

答案 0 :(得分:3)

你是否要将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(....);
}

答案 1 :(得分:2)

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