linux open read 和write的系统调用出现了点顺序问题。。。

#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>intmain(){in... #include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(){
int in_fd;
int out_fd;
char buffer;
char buff[10];
int tmp;
int i=0;
in_fd=open("write.c",O_RDONLY);
out_fd=open("out",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
while(read(in_fd,&buffer,1)==1 && i<10){
write(out_fd,&buffer,1);
putchar(buffer); //这里输出10个字符。。
i++;
}
tmp=read(in_fd,buff,4);
if(tmp==-1)
write(2,"error",tmp);
else
{
write(1,buff,tmp); //这里也是输出4个字符
}
exit (0);
}
输出结果是这个istd#include<u
注意原来的应该 按说前面的应该先执行输出 #include<uistd 才对吧 新手,求指导。。。
展开
 我来答
风若远去何人留
2013-11-05 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450134
专业C/C++软件开发

向TA提问 私信TA
展开全部
你的write.c第一行是
#include<unistd.h>

是这样的吧?

首先是读取的流程
显示while循环读数据,循环执行了10次 因为i=10而退出,但读数据实际读了11次,这个不难理解吧
所以这11次读的数据分别是#include<un 前10个被存到文件out里面,同时由putchar输出

然后一次性读四个字节"istd" 这四个字节用write(1....)输出

write输出的时候是直接写到stdout上,而putchar和printf一样 是缓冲类输出,在C库中对于这类输出数据并不会马上写到终端,而是当遇到换行/缓冲区满/程序退出/缓冲区flush 等等情况才会输出到stdout

这样就导致了,write输出的四个字节马上输出了,而putchar的10个字节一直在buffer中,直到程序退出才会输出。于是 后写的在前,前面的反而到后面了

尝试在while结束后输出一个\n或者做一下flush 就可以看到效果了

也可以在程序结尾加一个getchar 或者while(1) 可以看到程序退出前,那10个字符是不会被输出的
z490721123
2013-11-05 · 超过25用户采纳过TA的回答
知道答主
回答量:115
采纳率:0%
帮助的人:68.5万
展开全部
这还是一个缓冲区的问题, putchar和write都是把数据放入缓冲区,等它满或者其他情况输出。你的情况就是这样。 你可以在putchar之后 调用 fflush(NULL); 清空缓冲区
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式