【C语言】文件操作(上部)

打开文件 & 关闭文件

打开文件 需要 文件指针 接收; 关闭文件 需要传入 文件指针

FILE *fp; // 定义文件指针

打开文件

使用到的函数 fopen()

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);

参数

参数 含义
*path 文件的路径,支持相对路径绝对路径
*mode 指定文件打开的模式:
rwar+w+a+
b:以二进制形式打开文件,可以与上面的6种结合("rb", "wb", "ab", "r+b", "w+b", "a+b"

返回值

  • 打开成功,则返回一个指向 FILE结构的 文件指针
  • 打开失败,则返回 NULL 并设置 errno 为指定的错误。

打开文件模式

文件打开模式 说明
“r” 1. 以只读的模式打开一个文本文件,从文件头 开始读取
2. 该文本文件必须存在
“w” 1. 以只写的模式打开一个文本文件,从文件头 开始写入
2. 如果文件不存在则创建一个新的文件
3. 如果文件已存在则将文件的长度截断为 0(重新写入的内容将覆盖 原有的 所有内容
“a” 1. 以追加的模式打开一个文本文件,从文件末尾 追加内容
2. 如果文件不存在则创建一个新的文件
“r+” 1. 以读和写的模式打开一个文本文件,从文件头 开始读取和写入
2. 该文件必须存在
3. 该模式不会将文件的长度截断为 0(只覆盖重新写入的内容原有的内容保留
“w+” 1. 以读和写的模式打开一个文本文件,从文件头 开始读取和写入
2. 如果文件不存在则创建一个新的文件
3. 如果文件已存在则将文件的长度截断为 0(重新写入的内容 将覆盖原有的所有内容
“a+” 1. 以读和追加的模式打开一个文本文件
2. 如果文件不存在则创建一个新的文件
3. 读取是从文件头 开始,而写入 则是在 文件末尾 追加
“b” 1. 与上面 6 中模式均可结合(”rb”, “wb”, “ab”, “r+b”, “w+b”, “a+b”)

关闭文件

使用到的函数 fclose()

#include <stdio.h>

int fclose(FILE *fp);

参数

参数 含义
fp 指向一个待关闭的文件指针

返回值:

  • 关闭成功,返回值是 0;
  • 关闭失败,返回值是 EOF,并设置 errno 为指定的错误。

备注:

磁盘已满设备出错或者 I/O 错误均可能导致 fclose 函数调用失败。

实例 (打开文件 & 关闭文件)

#include <stdio.h>
#include <stdlib.h>

int main(void){

    FILE *fp; // 定义文件指针

    // 打开文件
    fp = fopen("data.txt","r");
    if (fp == NULL){
        printf("打开文件失败!!!\n");
        exit(EXIT_FAILURE);
    };

    // 关闭文件
    if (fclose(fp) != EOF){
        printf("关闭文件成功~~~");
        exit(EXIT_SUCCESS);
    };


    return 0;
}

mark

文件读写

字符读写

字符读 ‘fgetc()’、’getc()’

fgetc() 说明

#include <stdio.h>
...
int fgetc(FILE *stream);

参数说明:

  • stream 该参数是一个 FILE 对象的指针,指定一个待读取的文件流

返回值:

  • 成功:
    • 将读取到的 unsigned char 类型转换为 int 类型返回
  • 失败:
    • 如果文件结束或者遇到错误则返回 EOF

getc() 说明

fgetc()getc() 两个的功能 和 描述基本上是 一模一样 的,它们的区别主要在于实现上:fgetc() 是一个函数;而 getc() 则是一个宏的实现

实例

#include <stdio.h>
#include <stdlib.h>

int main(){

    // 定义文件指针
    FILE *fp;

    // 打开文件
    if ((fp = fopen("./data.txt","r")) == NULL){
        // 文件打开失败
        exit(EXIT_FAILURE);
    }

    // 读取文件的内容
    char ch;
    while ((ch = fgetc(fp)) != EOF){
        putchar(ch);;
    }

    // 关闭文件流
    fclose(fp);

    return 0;
}

mark

字符写 ‘fputc()’、’putc()’

一个字符 写入指定的文件中并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。

fputc() 说明

#include <stdio.h>
...
int fputc(int c, FILE *stream);

参数说明:

  • c: 指定待写入 的字符
  • stream: 该参数是一个 FILE 对象的 指针,指定一个待写入的文件流

返回值:

  • 成功:
    • 返回写入的字符
  • 失败:
    • 如果文件结束或者遇到错误则返回 EOF

putc() 说明

fputc()putc() 两个的功能 和 描述基本上是 一模一样 的,它们的区别主要在于实现上:fputc() 是一个函数;而 putc() 则是一个宏的实现

实例

#include <stdio.h>
#include <stdlib.h>

int main(){

    // 定义文件指针
    FILE *fp;

    // 打开文件
    if ((fp = fopen("./data.txt","w")) == NULL){
        // 文件打开失败
        exit(EXIT_FAILURE);
    }

    // 写入一个字符
    char ch = 'A';
    if (fputc(ch,fp) == EOF){
        // 写入失败
        exit(EXIT_FAILURE);
    };

    // 关闭文件流
    fclose(fp);

    return 0;
}

mark

字符串读写

字符读 ‘fgets()’

用于从指定文件读取 字符串

最多可以读取 size - 1 个字符,因为结尾处会自动添加一个字符串结束符 '\0'。当 读取 到换行符('\n')文件结束符(EOF)时,表示结束读取('\n' 会被作为一个合法的 字符读取)。

fgets() 说明

#include <stdio.h>
...
char *fgets(char *s, int size, FILE *stream);

参数说明:

  • s: 字符型指针,指向用于存放读取 字符串的 位置
  • size: 指定读取的 字符数(包括最后自动添加的 ‘\0’)
  • stream: 该参数是一个FILE 对象的 指针,指定一个待操作的数据流

返回值:

  • 成功:
    • 返回 s 参数指向的地址
  • 失败:
    • 如果在读取 字符的 过程中遇到EOF,则 eof 指示器被设置;如果还没读入 任何字符遇到这种 EOF,则 s 参数指向的位置保持原来的内容,函数返回 NULL
    • 如果在读取的过程中发生错误,则 error 指示器被设置,函数返回 NULL,但 s 参数指向的内容 可能 被改变

实例

#include <stdio.h>
#include <stdlib.h>

#define MAX 1024

int main(){
    // 打开文件
    FILE *fp;
    if ((fp = fopen("./data.txt","r")) == NULL){
        exit(1);
    }
    // 读取文件
    char s[MAX];
    if (fgets(s,MAX,fp) == NULL){
        // 读取失败
        exit(2);
    };
    printf("%s",s); // 输出读取内容
    // 关闭文件
    fclose(fp);

    return 0;
}

mark

字符写 ‘fputs()’

fputs 函数用于将一个字符串写入到指定的文件中,表示字符串结尾的 ‘\0’ 不会被一并写入

fputs() 说明

#include <stdio.h>
...
int fputs(const char *s, FILE *stream);

参数说明:

  • s: 字符型指针,指向用于存放 待写入 字符串的位置
  • stream: 是一个 FILE 对象的 指针指定一个待操作的数据流

返回值:

  • 成功:
    • 返回一个非 0 值
  • 失败:
    • 返回 EOF

实例

#include <stdio.h>
#include <stdlib.h>

int main(void){
    // 打开文件
    FILE *fp;
    if ((fp = fopen("./data.txt","w")) == NULL){
        exit(1); // 打开文件失败
    };

    // 写入内容
    char s[] = "i love you ***";
    if (fputs(s,fp) != 0){
        exit(2); // 写入失败
    }

    // 关闭失败
    fclose(fp);

    return 0;
}

mark

发表评论 / Comment

用心评论~