fgets(sendline, MAXLINE, stdio)难道不是行缓冲?
UNIX网络编程在谈到select和stdio混合使用时说:
fgets读入多行后只返回其中第一行 对此我感觉有些不解 涉及到终端设备的stdio不都是按行缓冲吗?怎么会只返回第一行呢(甚至觉得根本不存在读入多行这种情况 因为读了一行就返回了啊)
请帮忙指出问题所在。。
其中,char sendline[MAXLINE]
[解决办法]
从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
[解决办法]
fgets 不一定是从终端读取呀
[解决办法]
fgets 不一定是从终端读取呀
难道fgets的第三个参数是stdin不能说明它是从终端读取吗?
p.s.帖子的标题写错了 第三个参数stdio应为stdin
书中说 "fgets读入多行后只返回其中第一行" 有提到是从终端来读取的没有? 其实缓冲都是在文件层缓冲的. fgets 只是用 fgetc 一个一个的读入字符, 并判读是否是 \n 而已, 是就返回已经读的.
不好意思 我来换个问法吧:当调用一次fgets的时候(即只发生一次系统调用)然后从内核缓冲区读了许多行到用户缓冲区(即stdio缓冲区)然后下次在调用fgets的时候其实并没有发生系统调用 而是直接从用户缓冲区读一行即可?
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;