首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

fgets(sendline, MAXLINE, stdio)莫不是不是行缓冲

2013-07-21 
fgets(sendline, MAXLINE, stdio)难道不是行缓冲?UNIX网络编程在谈到select和stdio混合使用时说:fgets读入

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 不一定是从终端读取呀
[解决办法]

引用:
Quote: 引用:

fgets 不一定是从终端读取呀


难道fgets的第三个参数是stdin不能说明它是从终端读取吗?


p.s.帖子的标题写错了 第三个参数stdio应为stdin


书中说 "fgets读入多行后只返回其中第一行" 有提到是从终端来读取的没有?  其实缓冲都是在文件层缓冲的. fgets 只是用 fgetc 一个一个的读入字符, 并判读是否是 \n 而已, 是就返回已经读的.

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

fgets 不一定是从终端读取呀


难道fgets的第三个参数是stdin不能说明它是从终端读取吗?


p.s.帖子的标题写错了 第三个参数stdio应为stdin


书中说 "fgets读入多行后只返回其中第一行" 有提到是从终端来读取的没有?  其实缓冲都是在文件层缓冲的. fgets 只是用 fgetc 一个一个的读入字符, 并判读是否是 \n 而已, 是就返回已经读的.


不好意思 我来换个问法吧:当调用一次fgets的时候(即只发生一次系统调用)然后从内核缓冲区读了许多行到用户缓冲区(即stdio缓冲区)然后下次在调用fgets的时候其实并没有发生系统调用 而是直接从用户缓冲区读一行即可?


读了多少到用户缓冲区不是看行数, 而是由这个 FILE 指针

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;


        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;


里面的 _bufsiz 决定的. 有可能是多行, 也有可能不到一行, 那样的话一个 fgets 可能会有多次系统调用.
对于想你说的 stdin 的时候, 或者是网络包的时候, 这个 read 实际读取的数量可能是没有要求的那么多的:
stream->_cnt = _read(_fileno(stream), stream->_base, stream->_bufsiz);
返回的 stream->_cnt 是可能小于 stream->_bufsiz 的.

另外提醒下, 我上面的代码是来自 VC 的, 不是 UNIX 的, 但是对 C 的标准 IO 实现我想大概是差不多的. 不放心的话再找 glibc 的源代码来看看吗.

热点排行
Bad Request.