C语言文件操作最有这一篇就够了(初阶)

一、文件操作的基本概念

C语言通过标准库提供了丰富的文件操作函数。这些函数大部分定义在头文件<stdio.h> 中。我们可以通过这些函数来实现:

  • 创建文件
  • 打开文件
  • 读取文件内容
  • 写入文件内容
  • 关闭文件

C语言将文件操作看作是“流”的处理,即将数据从程序流向文件或从文件流向程序。

文件指针 (FILE *)

文件操作通过 FILE * 文件指针进行。FILE 是一个结构体类型,包含与文件相关的信息。我们使用 fopen() 打开文件时会返回一个指向 FILE 类型的指针,之后通过这个指针对文件进行操作。

二、文件的打开与关闭

文件打开:fopen()

fopen() 是打开文件的主要函数。语法如下:

FILE *fopen(const char *filename, const char *mode);
参数:
  1. filename:文件路径(可以是相对路径或绝对路径)。
  2. mode:文件的打开模式。

 打开模式列表:

模式描述

"r"

以只读模式打开文件,文件必须存在。

"w"

以写模式打开文件,文件不存在则创建,存在则清空内容。

"a"

以追加模式打开文件,文件不存在则创建,写入附加到末尾。

"r+"

以读写模式打开文件,文件必须存在。

"w+"

以读写模式打开文件,文件不存在则创建,存在则清空内容。

"a+"

以读写模式打开文件,写入附加到末尾。文件不存在则创建。

例如

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w"); // 以写入模式打开文件
    if (file == NULL) {  // 检查文件是否打开成功
        printf("文件打开失败!\n");
        return -1;
    }
    printf("文件打开成功!\n");
    fclose(file);  // 关闭文件
    return 0;
}

文件关闭:fclose()

使用完文件后,必须关闭文件以释放资源。语法如下:

int fclose(FILE *stream);

返回值为 0 表示关闭成功,EOF 表示关闭失败。

 


三、文件的顺序读写

文件的顺序读写是最常见的操作模式。文件中的数据从头到尾按顺序读写。

文件写入

常用写入函数:
  1. fprintf(FILE *stream, const char *format, ...):格式化写入。
  2. fputs(const char *str, FILE *stream):写入字符串。
  3. fwrite(const void *ptr, size_t size, size_t count, FILE *stream):写入二进制数据。
示例代码:

3.1fprintf()   和fputs()

#include <stdio.h>

int main() {
    // 打开文件 example.txt,以写模式打开
    FILE* file = fopen("example.txt", "w");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return -1;
    }

    // 使用 fprintf 写入数据
    fprintf(file, "年龄: %d, 名字 : % s, 体重: % .2fkg\n", 17, "矛取矛求",75.60 );


    // 使用 fputs 写入字符串
    fputs("这是一个 完美的男人。\n", file);

    fclose(file); // 关闭文件
    printf("文件写入完成!\n");

    return 0;
}

运行结果

执行程序后,文件 example.txt 的内容如下:

😁

文件读取

逐字符读取文件

使用 fgetc() 从文件中逐个字符读取。

#include <stdio.h>

int main() {
    // 打开文件 example.txt,以只读模式打开
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return -1;
    }

    char ch;
    printf("逐字符读取文件内容:\n");

    // 使用 fgetc 按字符读取文件
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch); // 输出读取的字符
    }

    fclose(file); // 关闭文件
    return 0;
}

四、文件的随机读写 

以下是操控文件指针的几个重要函数:

 

  • fseek(FILE *stream, long offset, int origin) 

    • 功能:将文件指针移动到指定位置。
    • 参数:
      • stream:文件指针。
      • offset:相对于 origin 的偏移量。
      • origin:参考位置:
        • SEEK_SET:文件开头。
        • SEEK_CUR:文件当前位置。
        • SEEK_END:文件末尾。
  • ftell(FILE *stream)

    • 功能:获取当前文件指针的位置。
  • rewind(FILE *stream)

    • 功能:将文件指针移动到文件开头(等同于 fseek(stream, 0, SEEK_SET)

 

4.1随机写入数据

展示如何使用 fseek 定位文件中的位置,然后写入数据。

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w+"); // 打开文件(读写模式)
    if (file == NULL) {
        printf("文件打开失败!\n");
        return -1;
    }

    // 写入初始数据
    fprintf(file, "Hello, World!\n");

    // 将文件指针移动到第7个字符位置(从0开始计数)
    fseek(file, 7, SEEK_SET);
    fprintf(file, "C Language");

    fclose(file); // 关闭文件
    printf("随机写入完成!\n");
    return 0;
}

执行程序后,example.txt 的内容如下:

4.2 随机读取数据

展示如何从文件中读取指定位置的数据。

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r"); // 以只读模式打开文件
    if (file == NULL) {
        printf("文件打开失败!\n");
        return -1;
    }

    // 将文件指针移动到第7个字符位置
    fseek(file, 7, SEEK_SET);

    // 读取从第7个字符开始的5个字符
    char buffer[6]; // 注意:多分配一个字符用于存储 '\0'
    fread(buffer, sizeof(char), 5, file);
    buffer[5] = '\0'; // 手动添加字符串结束符

    printf("从文件中读取的数据:%s\n", buffer);

    fclose(file);
    return 0;
}

 4.3随机读写结构化数据(重要)

处理结构化数据(如结构体)时,随机读写特别有用。以下示例展示如何读写文件中的特定记录。

#include <stdio.h>
#include <string.h>

// 定义一个结构体
typedef struct {
    int id;
    char name[20];
    float score;
} Student;

int main() {
    FILE *file = fopen("students.dat", "wb+"); // 打开二进制文件(读写模式)
    if (file == NULL) {
        printf("文件打开失败!\n");
        return -1;
    }

    // 写入3条学生记录
    Student students[3] = {
        {1, "Alice", 88.5},
        {2, "Bob", 75.0},
        {3, "Charlie", 92.0}
    };
    fwrite(students, sizeof(Student), 3, file);

    // 随机修改第2条记录
    Student newStudent = {2, "Bob", 95.0};
    fseek(file, sizeof(Student) * 1, SEEK_SET); // 定位到第2条记录(从0开始计数)
    fwrite(&newStudent, sizeof(Student), 1, file);

    // 读取第2条记录,验证修改是否成功
    Student readStudent;
    fseek(file, sizeof(Student) * 1, SEEK_SET); // 定位到第2条记录
    fread(&readStudent, sizeof(Student), 1, file);

    printf("第2条记录修改后:ID=%d, Name=%s, Score=%.1f\n",
           readStudent.id, readStudent.name, readStudent.score);

    fclose(file); // 关闭文件
    return 0;
}

五、完整代码示例 

综合示例(如何实现文件的打开、顺序写入、顺序读取、随机写入和随机读取。)

#include <stdio.h>

int main() {
    FILE *file;

    // 打开文件并写入数据
    file = fopen("example.txt", "w+");
    if (file == NULL) {
        printf("文件打开失败!\n");
        return -1;
    }
    fprintf(file, "这是一个文件操作的示例。\n");
    fprintf(file, "学习C语言文件操作很重要。\n");

    // 随机写入数据
    fseek(file, 5, SEEK_SET);
    fprintf(file, "[插入内容]");

    // 读取文件内容
    rewind(file); // 回到文件开头
    char buffer[100];
    printf("文件内容如下:\n");
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    fclose(file); // 关闭文件
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值