我有一个C程序试图从stdin读取最多1024个字节。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int MAX_SIZE = 1024;
char *program = malloc(sizeof(char) * MAX_SIZE);
int STDIN_FD = 0;
int return_code = 0;
int bytes_read = read(STDIN_FD, program, MAX_SIZE);
if (bytes_read == -1) {
printf("Could not read from stdin");
return_code = 1;
} else {
printf("bytes read: %d\n", bytes_read);
program[bytes_read] = '\0';
printf("program: %s\n", program);
}
free(program);
return return_code;
}
我编译并运行它:
$ cat testfile.txt
hello
world
$ gcc -Wall -std=c99 oneline.c
$ cat testfile.txt | ./a.out
bytes read: 6
program: hello
为什么read()
只用第一行输入填充我的缓冲区?我无法在man 3 read
中看到对换行符的任何引用。
答案 0 :(得分:4)
来自linux手册页read(2)
手册:
返回值
成功时,返回读取的字节数(零表示文件结束),文件位置按此编号前进。如果此数字小于请求的字节数,则不是错误;这可能发生在例如因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或因为我们正在从管道或从终端读取),或者因为
read()
被信号打断了。出错时,返回-1,并正确设置errno
。在这种情况下,未指定文件位置(如果有)是否发生变化。
所以这是因为你正在阅读管道。显而易见的解决方案是继续阅读,直到返回0
。