-
目录
1.fopen:
- FILE *fopen(const char *path, const char *mode);
- path :带有路径的文件名称,(如果不带有路径,打开的文件可以是在当前路径下)
- 返回值:
- 成功:返回文件流指针 FILE*
- 失败:返回NULL
r |
|
---|---|
r+ |
|
w |
|
w+ |
|
a |
|
a+ |
|
-
2.fclose
- 作用:关闭文件。在打开文件操作完成后要关闭文件,不然会造成句柄泄露,当句柄持续泄露的时候,最终进程就不能再打开新的文件了:内存泄漏,导致进程占用文件过多,如果持续泄漏,总有一个时刻,操作系统是没有办法满足进程申请内存资源的请求,操作系统就会强杀进程。
-
3.fwrite
- size_ t fwrite(const void *ptf,size_ t size,size_ t nmemb, FILE *stream) ;
- 参数:
- ptr:想往文件当中写什么内容
- size:定义往文件当中写的时候,一个块是多大,单位是字节: (通常定义为一个字节)
- nmemb :期望写多少块
- stream:文件流指针
- 返回值:
- 返回成功写入到文件块的个数
- 验证一下:这里我们写入的块数设置为2,期望写入三块,但一共13个字符。
- 运行后我们可以发现成功写入文件6个字节
3.fread
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
- 参数:
- ptr:将从文件 当中读到的内容保存到ptr指向的内存空间当中
- size:定义从文件当中读的时候,一个块是多大,单位字节:(通常定义为一 个字节)
- nmemb :期望读多少块
- stream:文件流指针
- 返回值:
- 返回成功读入的文件块的个数
- 测试:
- 我们写一个fread测试一下,用size_t来接收返回值
- 可以看到成功读取文件中七个块的内容
- 我们再测试
- 1
-
4.fseek
- int fseek(FILE *stream, long offset, int whence);
- 作用:
- 移动文件 流指针的位置
- 参数:
- stream:文件流指针
- offset :偏移量,我们的whence只能让文件流指针偏移到开头或者末尾,或者当前位置,但有了我们的stream。就可以让文件流指针指向文件开头的后offset位置,或者文件末尾后offset位置。当前位置的后offset位置
- whence :将文件流指针偏移到什么位置
- SEEK_ SET:文件头部
- SEEK_ CUR:当前文件流指针的位置
- SEEK_ END: 文件末尾
- 返回值:
- 成功:0
- 失败:-1
- 测试:我们来看一个现象
- 我们让代码跑起来看结果我们发现文件中写入内容,但是并没有被读出来。
- 这是因为当前文件流指针在文件内容的末尾,所以此时我们就要用到我fseek函数
- 可以看到此时成功读取
- 1
-
2.系统调用文件接口
-
2.1open:
- int,open(const,char,*pathname, int ,flags);
- int,open( const,char,*pathname, int ,flags, mode_ t mode);
- 参数:
- pathname:要打开或创建的目标文件
- mode:当新创建一个文件的时候,指定 新创建文件的权限;传递一 个8进制的数字(就是权限,例如0664)
- flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行"或"运算,构成flags。
- O_ RDONLY: 只读打开
- O_ WRONLY:只写打开
- O_RDWR,:,读,写打开
- 这三个常量,必须指定一个且只能指定一个
- O_ CREAT:若文件不存在,则创建它。需要使用mode选项, 来指明新文件的访问权限.
- O_ APPEND:, 追加写
- 例如:我们想以可读可写,并且如果它不存在就创建它:可以输入参数
- O_RDWR|O_CREAT(通过位图的方式运算的)
- 返回值:
- 成功:新打开的文件描述符
- 失败: -1
- 测试:我们以读写的方式来打开一个文件,若不存在就创建它
- 我们来运行一下,可以发现文件创建成功并且返回文件描述符为3(或者叫文件操作句柄,或者文件句柄)
- 1
-
2.2write:
- ssize_t write(int fd, const void *buf, size_ t count);
- 参数:
- fd:文件描述符
- buf:将buf指向的内容写到文件当中去
- count:期望写多少字节(这里并没有块的概念)
- 返回值:
- 返回写入的字节数量。
-
2.3read :
- ssize_t read(int fd, void *buf, size_ t count) ;
- 参数:
- fd:文件描述符
- buf:将从文件当中读到的内容写到buf指向的空间当中去
- count:期望读多少字节
- 返回值:
- 返回读到的字节数量。
-
2.4、lseek:
- off_t lseek(int fd, off_t offset, int whence);
- 参数:
- fd:文件描述符
- offset:.偏移量, 单位字节
- whence:偏移的位置
- SEEK_ SET: 文件头部
- SEEK_ CUR:当前文件 流指针的位置
- SEEK_ END: 文件末尾
- 返回值:
- 成功:返回偏移的位置,单位字节。
- 失败: -1
-
2.5close:
- int close(int fd);
- 关闭文件描述符
- 我们来测试一下这些系统调用函数
- 我们可以看到成功读取成功写入
- 隐藏bug:我们可以看到每次读取时我们都要对读取的内容小于当前要保存字符的数组的大小减一。
- 这是因为:如果当我们读取文件内容时如果文件内的字符数大于或者等于我们保存读取到的内容的数组时,数组就会被文件中的内容充满,而没有预留“\0”的位置,如果这时我们要获取数组中的内容时,就会导致越界访问。从而导致程序崩溃
看到这里如果觉得有用不如点个赞再走吧!!!