C&C++快速入门

18、文件操作C

1、课程目标

  • 掌握C语言文件IO函数
  • 理解文本模式与二进制模式
  • 掌握文件指针操作
  • 了解常见的文件操作模式

2、名词解释

函数 说明
fopen 打开文件
fclose 关闭文件
fread 二进制读取
fwrite 二进制写入
fprintf/fscanf 格式化读写
fgets/fputs 行读写
fseek/ftell 文件定位
EOF 文件结束标识

3、代码实现

1. 基础文件操作

#include <stdio.h>

int main() {
    // 写入文件
    FILE* fp = fopen("test.txt", "w");
    if (fp == NULL) {
        printf("打开文件失败!\n");
        return 1;
    }
    
    fprintf(fp, "Hello, File!\n");
    fprintf(fp, "行2: 数字 %d\n", 42);
    fclose(fp);
    printf("写入成功\n");
    
    // 读取文件
    fp = fopen("test.txt", "r");
    if (fp) {
        char line[256];
        printf("\n文件内容:\n");
        while (fgets(line, sizeof(line), fp)) {
            printf("%s", line);
        }
        fclose(fp);
    }
    
    return 0;
}

2. 二进制文件

#include <stdio.h>

typedef struct {
    int id;
    char name[32];
    float score;
} Student;

int main() {
    // 写入二进制数据
    Student students[] = {
        {1, "Alice", 95.5f},
        {2, "Bob", 87.0f},
        {3, "Charlie", 92.3f}
    };
    
    FILE* fp = fopen("students.dat", "wb");
    if (fp) {
        fwrite(students, sizeof(Student), 3, fp);
        fclose(fp);
        printf("二进制写入成功\n");
    }
    
    // 读取二进制数据
    Student loaded[3];
    fp = fopen("students.dat", "rb");
    if (fp) {
        fread(loaded, sizeof(Student), 3, fp);
        fclose(fp);
        
        printf("\n读取结果:\n");
        for (int i = 0; i < 3; i++) {
            printf("ID=%d, Name=%s, Score=%.1f\n",
                   loaded[i].id, loaded[i].name, loaded[i].score);
        }
    }
    
    return 0;
}

3. 文件定位

#include <stdio.h>

int main() {
    FILE* fp = fopen("test.txt", "rb");
    if (!fp) return 1;
    
    // 获取文件大小
    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);
    printf("文件大小: %ld 字节\n", size);
    
    // 回到开头
    fseek(fp, 0, SEEK_SET);
    
    // 读取前10个字节
    char buffer[11] = {0};
    fread(buffer, 1, 10, fp);
    printf("前10字节: %s\n", buffer);
    
    fclose(fp);
    return 0;
}

4、课后作业

4.1、作业1:文件复制

实现二进制文件复制功能。

4.2、作业2:简单配置文件解析

解析key=value格式的配置文件。