read、write函数了解
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结尾的,所以停止了。
[解决办法]