fopen
需要的头文件:
#include <stdio.h>
函数原型:
FILE *fopen(const char *pathname, const char *mode);
参数:
- pathname: 文件路径
- mode:
- “r” :以只读方式打开文件,该文件必须存在。
- “w” :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
- “a” :以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
- “r+” :以可读写方式打开文件,该文件必须存在。
- “w+” :打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
- “a+”:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
- “rb” :只读打开一个二进制文件,只允许读数据。
- “wb” :只写打开或建立一个二进制文件,只允许写数据。
- “ab” :追加打开一个二进制文件,并在文件末尾写数据。
- “rb+” :读写打开一个二进制文件,允许读写数据,文件必须存在。
- “wb+” :读写打开或建立一个二进制文件,允许读和写。
- “ab+” :读写打开一个二进制文件,允许读,或在文件末追加数据。
- “rt” :只读打开一个文本文件,只允许读数据。
- “wt” :只写打开或建立一个文本文件,只允许写数据。
- “at” :追加打开一个文本文件,并在文件末尾写数据。
- “rt+” :读写打开一个文本文件,允许读和写。
- “wt+” :读写打开或建立一个文本文件,允许读写。
- “at+” :读写打开一个文本文件,允许读,或在文件末追加数据。
打开方式总结:
① 打开是否为二进制,用“b”标识;
② 读写方式有以下几种:只读、只写、读写、追加只写、追加读写。
③ 对文件是否必须存在,以及存在时是清空还是追加会有不同的响应。具体判断如下图:
参考:fopen函数mode参数详解_fopen mode_allinallinallin的博客-CSDN博客
- 返回值:文件顺利打开后,指向该流的文件指针就会被返回,若文件打开失败则返回NULL。
fclose
需要的头文件:
#include <stdio.h>
函数原型:
int fclose(FILE *stream);
参数:
- stream: 文件指针(也就是fopen成功之后返回的指针)
fread 和 fwrite
需要的头文件:
#include <stdio.h>
函数原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:
- ptr: 指向“数据读取到之后存储到的缓存区”/“要写入的数据存放的缓存区”的指针
- size: 读取/写入 的 基本单元 字节大小 , 单位是字节 , 且一般是缓冲的单位大小
- 如果缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
- 如果缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
- nmemb: 读取/写入 的 基本单元 个数
- stream: 文件指针
- 返回值 : 实际从文件中读取/写入的 基本单元 个数 ; 读取/写入的字节数是 基本单元数 * 基本单元字节大小
- 对于写write:哪怕size设置基本单元的大小是100个char,但是nmemb设置了1,那么返回值就是1, 返回值严格跟随nmemb的值,但是当缓冲区的数据已经全部写完的时候,就不会再继续增加内容了,只不过进行无意义的写操作使得最后写的次数等于nmemb
- 对于读read,同样返回值大部分情况下跟随nmemb的值,除了:当给出的读取缓存区已经已经读满了或者已经没东西可读了,那么就不会再读了,并且返回已经读的基本单元个数
fseek
需要的头文件:
#include <stdio.h>
函数原型:
int fseek(FILE *stream, long offset, int whence);
参数:
- stream: 文件指针
- offset: 偏移量
- whence: SEEK_SET(头)或 SEEK_CUR(当前) 或 SEEK_END(尾)
- 返回值:如果执行成功 , 则返回 0 , 失败返回非 0 , 并设置 error 错误代码
实操演示
demo9.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{FILE *fp;char *write_buf = "mjmmm";char *read_buf;fp = fopen("./mjm.txt","w+");int count = fwrite(write_buf, sizeof(char), strlen(write_buf),fp);// fwrite(write_buf, sizeof(char)*strlen(write_buf), 1,fp);printf("%d bytes has been written\n",count);fseek(fp,0,SEEK_SET);read_buf = (char *)malloc(sizeof(char)*count);fread(read_buf, sizeof(char),strlen(write_buf),fp); //注意此时第三个参数不能使用 strlen(read_buf), 因为read_buf中没有任何有效参数,所以会是0//fread(read_buf, sizeof(char)*strlen(write_buf),1,fp);printf("context:%s\n",read_buf);fclose(fp);return 0;
}
运行代码:
打开mjm.txt: