我做了类似这样的事情来阅读标准输入。
char *lines[50];
char buffer[50];
while((fgets(buffer, sizeof(buffer), stdin))!=NULL) {
buffer[strlen(buffer)-1] = '\0';
lines[i] = malloc(strlen(buffer));
memcpy(lines[i++], buffer, strlen(buffer));
}
我想使用read
系统调用做类似的事情。
while((nread=read(0, buffer, sizeof(buffer)))>0) {
buffer[strlen(buffer)-1] = '\0';
lines[i] = malloc(strlen(buffer));
memcpy(lines[i++], buffer, strlen(buffer));
}
将i重置为0并使用printf("%s", lines[i])
打印出字符串,我得到第一种方法的正确结果,但在第二种方法中并不总是对应的结果。为什么是这样?
另外,当使用read从标准输入读取时,是否需要在字符串的末尾附加一个空字符或者是否为您执行此操作?
我从包含以下内容的文件中指导输入:
This is test input
This is another test input
Not reading correctly, not reading correctly
当我使用fgets()
获取输入后打印时,我得到与输出完全相同的内容。
当我使用read()
获取输入后进行打印时,我得到了这个:
This is test input
This is another test input
Not
reading correctly, not reading correctly
put
No
附加说明:
如果我将char buffer[50]
更改为更大的值,则第二种情况有效,但我不明白为什么它不适用于此特定实例。
当我从文件重定向输入时,问题似乎是read
读取所有50个字符。有没有什么方法可以读取换行符并在每次迭代时停止?从控制台接收输入时似乎这样做。
答案 0 :(得分:4)
read
不会添加任何内容;没有终止0.在read
之后,strlen(buffer)
返回任何内容,具体取决于read
之前缓冲区中的内容。好消息是,您根本不需要拨打strlen
,因为read
会返回一些传输的字符:
while((nread = read(0, buffer, sizeof(buffer) - 1))>0) {
buffer[nread] = '\0';
lines[i] = malloc(nread + 1));
memcpy(lines[i], buffer, nread + 1);
}
PS:不要忘记对-1进行nread
测试。