在使用fread的代码中有一个错误

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

我得到它的权利?

你是否要终止字符串读取? 如果是这样,那么是的, 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(....); } 

我相信代码的目的是从wc -l输出中删除最后的换行符,这就是为什么它要写入换行符在字符串末尾的位置。 它仍然不是特别合理的代码,因为你需要在你的$PATH循环中有一个非常小的BUFSIZ或错误的wc ,并且如果它循环了,那么覆盖新行应该只发生在最后一遍(等同地和可测试地,它应该检查buffer[chars_read - 1] == '\n' )。