当前位置: 技术问答>linux和unix
一个关于IO的问题
来源: 互联网 发布时间:2016-09-08
本文导语: 第一种:这种不能输出 n = read(fd, buf, 256); write(1, buf, n); 第二种:这种能输出,但是结果有些异常 n = read(fd, buf, 256); printf("%s", buf); 结果:conect 192.168.1.101 OK hello world! zch@zch-laptop:~/桌面/12th$ /桌面/12th$ 就...
第一种:这种不能输出
第二种:这种能输出,但是结果有些异常
结果:conect 192.168.1.101 OK
hello world!
zch@zch-laptop:~/桌面/12th$ /桌面/12th$
就是命令行的图标有问题
前些天也问了一个关于输出的问题,说是要加fflush(stdout)就正常了,但是也有很多小问题,总是输出不完美
先问一下这两种的原因吧
n = read(fd, buf, 256);
write(1, buf, n);
第二种:这种能输出,但是结果有些异常
n = read(fd, buf, 256);
printf("%s", buf);
结果:conect 192.168.1.101 OK
hello world!
zch@zch-laptop:~/桌面/12th$ /桌面/12th$
就是命令行的图标有问题
前些天也问了一个关于输出的问题,说是要加fflush(stdout)就正常了,但是也有很多小问题,总是输出不完美
先问一下这两种的原因吧
|
从你打出来的这两个语句来说的话,很正常啊
|
从LZ给出的代码来看语法上是没问题的,但是输出很奇快,我想可能是字符串结尾不是‘’导致的,LZ可试试在调用read之前,加上bzero(buf, sizeof(buf));这句代码, 我想应该不会有问题了,这个是我写的一个例子。
至于你说的要加fflush(stdout)就正常了,我想是write和printf缓冲机制不一样导致的。write是无缓冲的,可以立即输出;而printf是行缓冲的,即使用printf时,遇到换行符才会输出缓冲中的字符串,或者程序exit时,自动输出。
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
char buff[256];
bzero(buff, sizeof(buff));
n = read(0, buff, 256);
write(1, buff, n);
printf("%s", buff);
return 0;
}
至于你说的要加fflush(stdout)就正常了,我想是write和printf缓冲机制不一样导致的。write是无缓冲的,可以立即输出;而printf是行缓冲的,即使用printf时,遇到换行符才会输出缓冲中的字符串,或者程序exit时,自动输出。
|
缓冲机制的差异
|
LZ,这个程序我在自己的机器上测试过,绝对可以输出的,如果有问题,你把输出结果贴出来看下。
|
n = read(fd, buf, 256)
请检查一下这个n是否正常。
假设n为0,
write(1,buf,0) 当然不会有输出,
而printf("%s", buf);只是将缓冲区打印了下。注意,你的缓冲区并没有初始化过,而又没有成功读进内容,打印出来的当然是随机字符了。如果你在读前把buf memset为0,肯定第2种也没输出了……
请检查一下这个n是否正常。
假设n为0,
write(1,buf,0) 当然不会有输出,
而printf("%s", buf);只是将缓冲区打印了下。注意,你的缓冲区并没有初始化过,而又没有成功读进内容,打印出来的当然是随机字符了。如果你在读前把buf memset为0,肯定第2种也没输出了……
|
int talk_with_server(int fd)
{
char buf[256];
int n;
n = read(fd, buf, 256);
write(1, buf, n);
}
上面你的这个函数中,你在n=read()之前,加上bzero(buf, sizeof(buf));同时检查read是否出错,没有出错再write。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。