其他
系统编程-文件读写这件小事
write/read
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
fd 文件描述符,这个应该不用多做解释 buf 要写入的内容,或者读出内容存储的buf,合适的大小非常关键 count 读或写的内容大小
返回大于0,表示读或写入对应的字节数。对于read,返回0表示到文件结尾。
正常读写
//博客:https://www.yanbinghu.com
//file.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{
char writeBuf[] = "https://www.yanbinghu.com";
char readBuf[128] = {0};
/*可读可写,不存在时创建,有内容时截断*/
int fd = open("test.txt",O_RDWR | O_CREAT | O_TRUNC);
if(-1 == fd)
{
perror("open failed");
return -1;
}
/*写内容*/
ssize_t wLen = write(fd,writeBuf,sizeof(writeBuf));
if(wLen < 0)
{
perror("write failed");
close(fd);
return -1;
}
printf("write len:%ld\n",wLen);
ssize_t rLen = read(fd,readBuf,sizeof(readBuf));
if(rLen < 0)
{
perror("read failed");
close(fd);
return -1;
}
readBuf[sizeof(readBuf)-1] = 0;
printf("read content:%s\n",readBuf);
close(fd);
return 0;
}
$ ./writeFile
write len:26
read content:
理解这个问题需要理解文件描述符和偏移量。
文件描述符
设置偏移量
0000000 h t t p s : / / w w w . y a n b
0000020 i n g h u . c o m \0
0000032
off_t lseek(int fd, off_t offset, int whence);
offset 相对于whence的偏移量 whence 相对位置
SEEK_SET 文件开始处 SEEK_CUR 当前位置 SEEK_END 文件末尾
注意,offset是可以为负的。
读取写入的内容
read content:https://www.yanbinghu.com
常见报错
Bad file descriptor
Interrupted system call
File exists
No such file or directory
Too many open fileswrite
65535
总结
检查接口的返回值,处理出错场景 对于不期望被修改内容的参数,添加const限定符 善用man手册
相关精彩推荐