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

read、write函数了解

2012-06-25 
read、write函数理解程序描述:首先在当前目录下创建一个名为file的文件,然后把hello world存到file文件

read、write函数理解
程序描述:
首先在当前目录下创建一个名为"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>#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函数不能使用同一个地方打开的文件描述符吗?

[解决办法]
1.buf没有预留\0的位置,printf的%s会机械的寻找\0,直到找到为止,所以后面会接上什么东西不可预计

2.write之后文件会自动往后偏移写入的字节长度,所以直接read会读不到内容,你需要seek回文件头
[解决办法]
1, 因为你写了11个字节,也就是hello world出去,但没有写出\0, 而且又读了11字节到buff,所以buff非\0结尾,打印buff的时候会一直打印到\0为止,所以越界访问了,而且栈地址是从高到低增长的,所以你打印后定义的buff会打印完buff再打印buf,也就是打印了两次hello world,注意你的buf一定是有个\0结尾的,所以停止了。
[解决办法]
探讨
程序描述:
首先在当前目录下创建一个名为"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……

热点排行