因此,当您使用getchar()读取输入时,您需要使用输入的字符以及用于提交字符的换行符。
但是,我正在尝试使用read()将输入读入缓冲区。程序可能正在从键盘或输入文件中读取。当我在我的程序中输入一个字符时,它会读入字符和换行符,但是超出第一个字符的任何内容都不会被读入缓冲区。
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
//Success/failure of read
int read_status = 1;
//Success/failure of write
int write_status = 1;
//Buffer for reads/writes
char buffer[BUFSIZ] = {0};
int charsRead;
for(charsRead = 0; charsRead < BUFSIZ && read_status > 0; charsRead++)
{
fprintf(stderr, "Ready to read.\n");
read_status = read(0, buffer, 2);
fprintf(stderr, "First status: %i.\n", read_status);
fprintf(stderr, "Read a : ");
if(buffer[charsRead] == '\n')
{
fprintf(stderr, "newline\n");
}
else if(buffer[charsRead] == ' ')
{
fprintf(stderr, "space\n");
}
else
{
fprintf(stderr, "%c\n", buffer[charsRead]);
}
}
fprintf(stderr, "Printing read in chars: \n");
for(int i = 0; i < charsRead; i++)
{
if(buffer[i] == '\n')
{
fprintf(stderr, "newline\n");
}
else if(buffer[i] == ' ')
{
fprintf(stderr, "space\n");
}
else
{
fprintf(stderr, "%c\n", buffer[i]);
}
}
}
所以当我运行它时,会产生这个输出:
Ready to read.
a
First status: 2.
Read a : a
Ready to read.
b
First status: 2.
Read a : newline
Ready to read.
a
First status: 2.
Read a :
Ready to read.
b
First status: 2.
Read a :
Ready to read.
g
First status: 2.
Read a :
Ready to read.
e
First status: 2.
Read a :
Ready to read.
First status: 0.
Read a :
Printing read in chars:
e
newline
(blank)
(blank)
(blank)
(blank)
(blank)
我是否误解了阅读是如何运作的?我尝试在第一次尝试使用换行符之后添加另一个读取,但是,它没有解决问题。
这个程序也将写入stdout(将成为管道)。我需要为这个案子做些什么特别的考虑吗?
答案 0 :(得分:0)
所以,对于任何有兴趣的人,我都会想出答案。问题是我没有将指针移动到缓冲区,所以我一遍又一遍地覆盖第一个索引。
所以,这就是我的工作方式:
for(bytesRead = 0; bytesRead < BUFSIZ && read_status > 0; bytesRead++)
{
read_status = read(0, buffer + bytesRead, 1);
}