文件操作(C语言)

注:学习中,记录的笔记

打开文件

FILE *fopen(consr char* pathname, const char* mode);

pathname表示的是需要打开的文件路径
mode表示的是要打开的文件的模式
可选的模式:
读写权限
r: 只读,(打开的文件必须存在,否则报错)
w: 只写,(打开的文件如果存在,就打开,但是里面的内容清空;如果不存在,则新建文件)
a: 追加,(如果文件存在,那么将写入的数据追加到文件的末尾;如果文件不存在,则新建文件)
r+: 读写,(打开的文件必须存在,否则报错)
w+: 读写,(打开的文件如果存在,就打开,但是里面的内容清空;如果不存在,则新建文件)
a+: 追加,相当于a+r+(如果文件存在,那么将写入的数据追加到文件的末尾;如果文件不存在,则新建文件)
读写方式
t: 以文本文件的方式打开文件(默认)。
b: 以二进制的方式打开文件

关闭文件

在代码的最后,一定要关闭文件,避免出错。

fclose(FILE *fp)

以单个字符读取或写入文件

  • fgetc : 从指定的文件中读取一个字符

    int fgetc(FILE *fp);
    // fp是文件指针
    // fgetc()读取成功后返回读取到的字符,读取到文件末尾或读取失败时返回 EOF
    // EOF是定义的宏,一般是 -1
    
    // 举例
    char ch;
    FILE *fp = fopen("1.txt", "r");
    ch = fgetc(fp);
    
  • feof() : 用来判断文件内部指针是否指向了文件末尾

    int feof(FILE *fp);
    
  • ferror():用来判断文件操作是否出错

    int ferror(FILE *fp);
    
  • fputc() : 向指定的文件中写入一个字符

    int fputc(int ch, FILE *fp);
    // ch是要写入的字符,fp是文件指针。
    // fputc() 写入成功时返回写入的字符,失败时返回EOF,返回值类型为 int,
    
    // 举例
    char ch = 'a';
    fputc(ch, fp);
    

以字符串的形式读取或写入文件

  • fgets() : 从指定的文件中读取一个字符串,并保存到字符数组中(每次读取一行)

    char *fgets(char *str, int n, FILE *fp);
    // str为字符数组,n为要读取的字符数目,fp为文件指针
    // 返回值:读取成功时返回字符数组首地址(str),读取失败时,返回NULL;
    // 如果开始读取时,文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回NULL
    

    这里的 n一般来说会设置一个足够大的数,可以一次性读取一行的数据
    假设n不足够大,一次性只读取了一行的一半数据,那么下次读取还是会继续读取这一行的剩下的数据

    注意: 在读取字符之前如果出现了换行,或者读到了文件末尾,则读取结束。也就是说,fgets() 最多只能读取一行的数据,不能跨行

  • fputs() : 向指定的文件中写入一个字符串

    int fputs(char *str, FILE *fp);
    str是要写入的字符串,fp为文件指针。写入成功返回非负数,失败返回 EOF
    
    // 举例
    char *str = "hello world!";
    FILE *fp = fopen('1.txt', "at+");
    fputs(str, fp);
    

以数据块的形式读写文件

fread() : 从指定的文件中读取块数据(若干个字节的数据)

size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。

fwrite(): 向文件中写入块数据

size_t fwrite(void *ptr, size_t size, size_t count, FILE *fp);

ptr: 内存区块的指针,可以是数组、变量、结构体等。fread()中的ptr用来存放读取到的数据,fwrite()用来存放要写入的数据。
size: 表示每个数据块的字节数
count: 表示要读写的数据块的块数
fp: 表示文件的指针
理论上,每次读写size*count个字节的数据

格式化读写文件

  • 从文件中读取数据
    int fscanf(FILE *stream, const char *format, ...);
    

stream表示文件描述符,后面的参数和 scanf() 使用起来一样
返回值:参数列表中被成功赋值的个数

  • 将数据写入到文件
    int fprintf(FILE *stream, const char *format, ...);
    

stream表示文件描述符,后面的参数和 printf() 使用起来一样
返回值:成功写入的字符的个数

随机切换文件内部位置指针的位置

  • 将位置指针移动到文件开始
    void rewind(FILE *stream);
    
  • 将位置指针移动到任意位置
    int fseek(FILE *stream, long offset, int whence);
    
    stream表示文件描述符
    offset表示偏移量,为正数向后移动,为负数向前移动
    whence表示起始位置,从哪里开始计算偏移量
    可选参数:
    文件起点 0 SEEK_SET
    当前位置 1 SEEK_CUR
    文件终点 2 SEEK_END
    返回值:0
  • 计算当前位置指针距离文件起点的字节数(以二进制打开文件)
    long ftell(FILE *stream);
    
    返回值:当前的位置指针距离文件起点的偏移量(字节数)
  • 获取位置指针的当前位置
    int fgetpos(FILE *stream, fpos_t *pos);
    
    需要提前定义 fpos_t 变量
    返回值:0
  • 设置位置指针的当前位置
    int fsetpos(FILE *stream, const fpos_t *pos);
    
    需要提前定义 fpos_t 变量
    返回值:0

猜你喜欢

转载自blog.csdn.net/Sir666888/article/details/122112525