由于对std iostream和stdio的不满意,我决定创建自己的io库。这对我的教育有好处。
但是我有一个小问题。在终端文件描述符上运行时,Linux read()直到换行才返回。因此,如果我要求输入10个字节,即使输入20个字节也不会返回。更糟糕的是,那10个额外的字节没有记录在我通过的缓冲区中。
那10个额外的字节怎么了? Linux是否有用于读取的缓冲区? 我可以访问此缓冲区而不提供自己的缓冲区吗?
答案 0 :(得分:-1)
因此,Linux终端的默认行为是行缓冲。像this answer之类的东西可以一次读取一个字符(如果您想要的话)。
要回答有关获取其他10个字节的问题,如果再次读取,它将返回其余的字节。以下示例演示了多个顺序读取。如果在提示符下输入10个以上的字符,将进行第二次读取而不会阻塞,并返回从10到19的字符。将不会打印从0开始的从0开始的字符。
#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv)
{
int read1Count = 0;
int read2Count = 0;
char pBuffer[20];
printf("Provide input: ");
// flush stdout because buffering...
fflush(NULL)
read1Count = read(1, pBuffer, 10);
// flush stdout because buffering...
fflush(NULL)
printf("Provide input: ");
read2Count = read(1, pBuffer + 10, 10);
printf("\nRead 1: '");
if (read1Count < 0)
{
perror("Error on first read");
}
for (int i = 0; i < read1Count; i++)
{
printf("%c", pBuffer[i]);
}
printf("'\nRead 2: '");
if (read2Count < 0)
{
perror("Error on second read");
}
for (int i = 0; i< read2Count; i++)
{
// We started the second read at pBuffer[10]
printf("%c", pBuffer[i + 10]);
}
printf("'\n");
}
编译并运行它,我看到了
Provide input: 12345678910
Provide input:
Read 1: '1234567891'
Read 2: '0
'