目录
一、重新谈论文件
- 空文件也要在磁盘占据空间
- 文件 = 内容 + 属性
- 文件操作 = 对内容 + 对属性 or 对内容和属性
- 标定一个问题,必须使用:文件路径 + 文件名【唯一性】
- 如果没有指明对应的文件路径,默认是在当前路径进行文件访问
- 当我们把fopen, fclose, fread, fwrite等接口写完之后,代码编译之后,形成二进制可执行程序之后,但是没运行,文件对应的操作有没有被执行呢?没有 — 对文件的操作,本质是进程对文件的操作!
- 一个文件如果没有被打开,可以直接进行文件访问吗?不能!一个文件要被访问,就必须先被打开!— 用户进程 + os
所以,文件操作的本质就是进程和被打开文件的关系。
二、重新谈论文件操作 C
- 文件在哪里-》磁盘-》硬件-》os-》所欲哦人想要访问文件不能绕过os-》使用os提供的接口-》提供文件级别的系统调用接口-》可以,操作系统只有一个
- 操作 C语言
示例代码:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #define FILE_NAME "log.txt"
5
6 int main()
7 {
8 //以w方式单纯的打开文件,c会自动清空内部的数据
9 FILE* fp = fopen(FILE_NAME, "a");//r,w,r+(读写,不存在出错),w+(读写,不存在创建),a(apend, 追加),a+(读+追加)
10 if(fp == NULL)
11 {
12 perror("fopen");
13 return 1;
14 }
15 //char buffer[64];
16 把文件中的数据读取到buffer中
16 //while(fgets(buffer, sizeof(buffer) - 1, fp) != NULL)
17 //{
18 // buffer[strlen(buffer) - 1] = 0;
19 // puts(buffer);
20 //}
21
22 int cnt = 5;
23 while(cnt)
24 {
25 fprintf(fp, "%s:%d\n", "hello world", cnt--);
26 }
27
28 fclose(fp);
29 return 0;
30 }
如上,是我们之前学的文件相关操作。还有 fseek ftell rewind 的函数,在C部分已经有所涉猎。
三、系统文件I/O
操作文件,除了上述C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问,先来直接以代码的形式。
示例代码:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #include<sys/types.h>
5 #include<sys/stat.h>
6 #include<fcntl.h>
7 #define FILE_NAME "log.txt"
8
9 int main()
10 {
11 umask(0);
12 //"w" --> O_WRONLY | O_CREAT | O_TRUNC, 0666
13 //"a" --> O_WRONLY | O_CREAT | O_APPEND, 0666
14 int fd = open(FILE_NAME, O_RDONLY, 0666);
15 if(fd < 0)
16 {
17 perror("open");
18 return 1;
19 }
20 char buffer[1024];
21 ssize_t num = read(fd, buffer, sizeof(buffer) - 1);
22 if(num > 0)
23 {
24 buffer[num] = 0;
25 }
26 printf("%s", buffer);
27 //int cnt = 5;
28 //char outBuffer[64];
29 //while(cnt)
30 //{
31 // sprintf(outBuffer, "%s:%d\n", "aaaaa", cnt--);
32 // //你以\0作为字符串的结尾,是C语言的规定,和我文件有什么关系呢?
33 // write(fd, outBuffer, strlen(outBuffer));
34 //}
35 //printf("fd:%d\n", fd);
36
37 close(fd);
38
39 return 0;
40 }
3.1 接口介绍
- open
man open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
返回值:
成功:新打开的文件描述符
失败:-1
write read close lseek ,类比C文件相关接口
3.2 如何理解文件
示例代码:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 #include<sys/types.h>
5 #include<sys/stat.h>
6 #include<fcntl.h>
7 #define FILE_NAME(number) "log.txt"#number
8
9 int main()
10 {
11 printf("stdin->fd:%d\n", stdin->_fileno);
12 printf("stdout->fd:%d\n", stdout->_fileno);
13 printf("stderr->fd:%d\n", stderr->_fileno);
14 umask(0