read、write函数理解

a532727198609220922 2012-06-24 07:38:58
程序描述:
首先在当前目录下创建一个名为"file"的文件,然后把"hello world"存到file文件中,最后把file的内容读取出来并打印到屏幕上。

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
int fd;/*save file descriptor*/
char buf[11]="hello world",buff[11];

fd=open("file",O_CREAT|O_TRUNC|O_RDWR,0644);
if(fd<0)
{
perror("file creation failed");
exit(EXIT_FAILURE);
}

if(write(fd,buf,11)<0)
{
perror("file write failed");
exit(EXIT_FAILURE);
}

close(fd);
if((fd=open("file",O_RDONLY))<0)
{
perror("file open failed");
exit(EXIT_FAILURE);
}

if(read(fd,buff,11)>0)
{
printf("%s\n",buff);
}
close(fd);
exit(EXIT_SUCCESS);
}

[root@localhost test]# gcc -g fdread.c -o fdread
[root@localhost test]# ./fdread
hello worldhello world


问题一、程序输出结果为什么是"hello worldhello world",我期望的结果是"hello world",再说数组buff的最大长度为11,为什么能存储22个字符呢?
问题二、执行write后紧接着执行read时read函数会出错;只有先执行write,接着把"file"关闭,然后通过open把"file"文件重新打开,最后执行read这时read才会执行成功。这说明write和read函数不能使用同一个地方打开的文件描述符吗?
...全文
129 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
程序描述:
首先在当前目录下创建一个名为"file"的文件,然后把"hello world"存到file文件中,最后把file的内容读取出来并打印到屏幕上。
C/C++ code

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#i……
[/Quote]

2,write后文件指针移动到hello world位置之后了,你需要lseek(fd, 0, SEEK_SET)移动到文件头部再read.
qq120848369 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:
1, 因为你写了11个字节,也就是hello world出去,但没有写出\0, 而且又读了11字节到buff,所以buff非\0结尾,打印buff的时候会一直打印到\0为止,所以越界访问了,而且栈地址是从高到低增长的,所以你打印后定义的buff会打印完buff再打印buf,也就是打印了两次hello world,注意你的buf一定是有个\0结尾的,所以停止了。

……
[/Quote]

额, 我是热血流... 玩了一辈子了- -
jackyjkchen 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1, 因为你写了11个字节,也就是hello world出去,但没有写出\0, 而且又读了11字节到buff,所以buff非\0结尾,打印buff的时候会一直打印到\0为止,所以越界访问了,而且栈地址是从高到低增长的,所以你打印后定义的buff会打印完buff再打印buf,也就是打印了两次hello world,注意你的buf一定是有个\0结尾的,所以停止了。
[/Quote]

我现在的虚拟机里还有个传奇3的私服呢

qq120848369 2012-06-24
  • 打赏
  • 举报
回复
1, 因为你写了11个字节,也就是hello world出去,但没有写出\0, 而且又读了11字节到buff,所以buff非\0结尾,打印buff的时候会一直打印到\0为止,所以越界访问了,而且栈地址是从高到低增长的,所以你打印后定义的buff会打印完buff再打印buf,也就是打印了两次hello world,注意你的buf一定是有个\0结尾的,所以停止了。
jackyjkchen 2012-06-24
  • 打赏
  • 举报
回复
1.buf没有预留\0的位置,printf的%s会机械的寻找\0,直到找到为止,所以后面会接上什么东西不可预计

2.write之后文件会自动往后偏移写入的字节长度,所以直接read会读不到内容,你需要seek回文件头

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧