目录
基本流程
- 创建/打开一个文档
- 对文档进行编辑
- 保存文档
- 关闭文档
1 文件I/O
open()
read()
write()
lseek()
close()
1.1open函数
#include <fcntl.h>
int open(const char *pathname, int flags[, mode_t mode);
open函数参数说明:
- pathname:待打开文件的文件路径名;
- flags:访问模式,常用的宏有:
– O_RDONLY:只读
– O_WRONLY: 只写
– O_RDWR: 读写
– O_CREAT: 创建一个文件并打开
– O_EXCL: 测试文件是否存在,不存在则创建
– O_TRUNC: 以只写或读写方式成功打开文件时,将文件长度截断为0
– O_APPEND: 以追加方式打开文件
只有第二个参数flags = O_CREAT,第三个参数才会被用于设置新文件的权限,取值如下:
- S_IRWXU: 文件所有者,读、写、执行
- S_IRUSR: 文件所有者,读
- S_IWUSR: 文件所有者,写
- S_IXUSR: 文件所有者,执行
- S_IRWXG: 文件所属组,读、写、执行
- S_IRGRP: 文件所属组,读
- S_IWGRP: 文件所属组,写
- S_IXGRP: 文件所属组,执行
- S_IRWXO: 其他人,读、写、执行
- S_IROTH: 其他人,读
- S_IWOTH: 其他人,写
- S_IXOTH: 其他人,执行
返回值说明:
- 调用成功,返回一个文件描述符
- 不成功,返回-1
1.2read&write函数
-
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
-
read函数参数说明:
- fd: 从open或create函数返回的文件描述符
- buf: 缓冲区
- count: 读取数据的字节数
- ssize_t: 有符号的size_t,有三种返回值
– 正数:请求读取的字节数
– 0: 文件长度有限,若读写位置距文件末尾只有20字节,该函数请求读取30字节,则第一次读取时返回值为20,第二次读取时,返回0
– -1: 读取文件出错 - write函数参数说明:
- 返回值说明: 返回写入的字节数或者-1并设置errno
- 特殊说明: 向终端或网络端写数据时,可能会进入阻塞状态
1.3lseek函数
#include <unistd.h>
ssize_t write(int fd, off_t offset, int whence);
lseek函数参数说明:
- fd: 从open或create函数返回的文件描述符
- offset: 对文件偏移量的设置,参数可正可负
- whence: 控制设置当前文件偏移量的方法
– whence = SEEK_SET: 文件偏移量被设置为offset
– whence = SEEK_CUR: 文件偏移量被设置为当前偏移量+offset
– whence = SEEK_END: 文件偏移量被设置为文件长度+offset
返回值说明:
- 设置成功:返回新的偏移量
- 不成功:-1
1.4close函数
#include <unistd.h>
int close(int fd);
返回值说明:
- 成功:返回0
- 不成功:-1
案例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main()
{
int tempFd = 0;
char tempFileName[20]= "csc8.txt";
//1.creat a file
tempFd = open(tempFileName, O_RDWR| O_TRUNC |O_EXCL, S_IRWXU| S_IRWXG);
//check the file exsist
if(tempFd == -1){
perror("file open error.\n");
exit(-1);
}
//2. write data
int tempLen = 0;
char tempBuf[100] = {0};
scanf("%s", tempBuf);
tempLen = strlen(tempBuf);
write(tempFd, tempBuf, tempLen);
close(tempFd);
//3.read the file
tempFd = open(tempFileName , O_RDONLY);
if(tempFd == -1){
perror("file read error.\n");
exit(-1);
}
off_t tempFileSize = 0;
tempFileSize = lseek(tempFd, 0, SEEK_END);
lseek(tempFd, 0, SEEK_SET);
while(lseek(tempFd, 0, SEEK_CUR)!= tempFileSize){
read(tempFd, tempBuf, 1024);
printf("%s\n", tempBuf);
}
//4.close
close(tempFd);
return 0;
}
运行截图
总结
这是我第一次用csdn写上课学到的东西和自己的感想,这是一些总结:
①规范化变量名命名,对一些临时的变量会使代码可读性增强。
②学习c语言时,我习惯将花括号打成独立的两行,现在老师要求代码要规范,并且让我们自己体会这样的好处,大括号贴紧函数以及多用注释,大括号贴紧函数显得代码紧凑,多用注释可使得代码更易读懂,比如if、while等等在最后打个注释//of if可以让我们一眼就看出这个条件分支或者循环从哪开始到哪结束,可读性更强。
③文件函数对让我对第一节课所学的知识加深了一些印象,对其了解了许多。