Z
ZHANK
文件与预处理

文件读写

fopen/fclose、fprintf/fscanf、fgets/fputs、二进制读写

文件读写

C 把文件当作一个字节流——文本文件和二进制文件的读写语法一样,只是模式不同。

学完本章你将: 掌握 fopen/fclose、文本读写、二进制读写、错误处理。


fopen 打开文件

c
#include <stdio.h>

int main() {
    // 模式:r(读) w(写) a(追加) r+(读写) w+(读写) b(二进制)
    FILE *fp = fopen("data.txt", "w");
    if (fp == NULL) {
        perror("打开文件失败");   // 打印错误原因
        return 1;
    }

    fprintf(fp, "Hello, File!\n");
    fprintf(fp, "数字:%d\n", 42);

    fclose(fp);  // 必须关闭!
    return 0;
}

文本文件读取

c
// 方式 1:逐行读
FILE *fp = fopen("data.txt", "r");
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {
    printf("%s", line);
}
fclose(fp);

// 方式 2:格式化读
int num;
fscanf(fp, "%d", &num);

// 方式 3:逐字符
int ch;
while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);
}

二进制文件读写

c
// 写入二进制
int data[] = {1, 2, 3, 4, 5};
FILE *fp = fopen("data.bin", "wb");
fwrite(data, sizeof(int), 5, fp);
fclose(fp);

// 读取二进制
int buf[5];
fp = fopen("data.bin", "rb");
fread(buf, sizeof(int), 5, fp);
fclose(fp);

💡 二进制文件更紧凑、更快——不经过字符转换,直接存内存内容。


错误检测

c
FILE *fp = fopen("maybe_not_exist.txt", "r");
if (fp == NULL) {
    perror("fopen");  // 输出 "fopen: No such file or directory"
    return 1;
}

// 读取时检测结束
if (feof(fp)) printf("读到末尾了\n");
if (ferror(fp)) printf("读取出错了\n");