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';
我能做对吗?
答案 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'
)。