读书人

read、write函数了解

发布时间: 2012-06-25 18:37:39 作者: rapoo

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……

读书人网 >C语言

热点推荐