c语言文件操作

person c猿人    watch_later 2024-09-21 17:22:36
visibility 249    class fopen,fwrite    bookmark 专栏

在 C 语言中,文件操作是非常重要的一部分,通过文件读写,程序可以保存数据到磁盘或从磁盘读取数据。C 标准库提供了多种函数和方法来处理文件,本文将详细介绍文件的打开和关闭、文件读写操作,包括文本文件和二进制文件的处理方式。


目录

  1. 文件的打开与关闭
    • fopen
    • fclose
  2. 文件的读写操作
    • 文本文件操作
      • fgetc
      • fgets
      • fputc
      • fputs
      • fprintffscanf
    • 二进制文件操作
      • fread
      • fwrite
  3. 文件的定位与指针操作
    • ftell
    • fseek
    • rewind
  4. 文件错误处理
    • ferror
    • feof

1. 文件的打开与关闭

在进行文件操作时,首先需要通过 fopen 函数打开文件,操作完成后通过 fclose 函数关闭文件。

1.1 fopen

fopen 用于打开文件,返回指向 FILE 类型的指针。如果打开失败,返回 NULL

FILE *fopen(const char *filename, const char *mode);
  • filename:要打开的文件名。
  • mode:文件的打开模式,包括以下几种常见模式:
    • "r":以只读方式打开文件,文件必须存在。
    • "w":以写入方式打开文件,若文件存在则清空其内容,若文件不存在则创建文件。
    • "a":以追加模式打开文件,若文件不存在则创建文件,所有写入内容都追加到文件末尾。
    • "r+":以读写方式打开文件,文件必须存在。
    • "w+":以读写方式打开文件,若文件存在则清空其内容,若文件不存在则创建文件。
    • "a+":以读写方式打开文件,若文件不存在则创建文件,写入内容总是追加到文件末尾。

示例:打开文件

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 文件操作...

    fclose(file);
    return 0;
}

1.2 fclose

fclose 函数用于关闭文件,释放与文件关联的资源。

int fclose(FILE *stream);

示例:关闭文件

FILE *file = fopen("example.txt", "r");
if (file != NULL) {
    // 文件操作...
    fclose(file);
}

2. 文件的读写操作

文件的读写操作根据文件类型分为文本文件二进制文件两类。

2.1 文本文件操作

2.1.1 fgetc

fgetc 用于从文件中读取单个字符。

int fgetc(FILE *stream);
  • 返回读取到的字符(int 类型),若到达文件末尾则返回 EOF

示例:逐字符读取文件内容

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    int ch;
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch); // 输出字符
    }

    fclose(file);
    return 0;
}

2.1.2 fgets

fgets 用于从文件中读取一行文本。

char *fgets(char *str, int n, FILE *stream);
  • str:存储读取内容的字符串指针。
  • n:最多读取 n-1 个字符(最后一个字符留给 \0)。
  • 返回值:若成功则返回 str,若到达文件末尾或发生错误返回 NULL

示例:逐行读取文件内容

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    char buffer[100];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer); // 输出行
    }

    fclose(file);
    return 0;
}

2.1.3 fputc

fputc 用于将字符写入文件。

int fputc(int char, FILE *stream);
  • 成功返回写入的字符,失败返回 EOF

示例:写入字符到文件

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    fputc('A', file); // 写入字符 A
    fputc('\n', file); // 写入换行符

    fclose(file);
    return 0;
}

2.1.4 fputs

fputs 用于将字符串写入文件。

int fputs(const char *str, FILE *stream);
  • 成功返回非负值,失败返回 EOF

示例:写入字符串到文件

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    fputs("Hello, World!\n", file); // 写入字符串

    fclose(file);
    return 0;
}

2.1.5 fprintffscanf

fprintffscanf 是格式化输出和输入函数,类似于 printfscanf,但用于文件操作。

int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);

示例:使用 fprintffscanf

#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    fprintf(file, "姓名: %s 年龄: %d\n", "Alice", 25); // 写入格式化数据
    fclose(file);

    // 读取文件
    file = fopen("data.txt", "r");
    if (file != NULL) {
        char name[20];
        int age;
        fscanf(file, "姓名: %s 年龄: %d", name, &age); // 读取格式化数据
        printf("姓名: %s, 年龄: %d\n", name, age);
        fclose(file);
    }

    return 0;
}

2.2 二进制文件操作

与文本文件不同,二进制文件直接处理原始字节,读写不涉及编码转换。

2.2.1 fread

fread 用于从二进制文件中读取数据。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:数据存储的缓冲区指针。
  • size:每个数据块的大小(字节数)。
  • nmemb:要读取的数据块数量。
  • 返回值:实际读取的块数。

2.2.2 fwrite

fwrite 用于向二进制文件写入数据。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:要写入的数据指针。
  • size:每个数据块的大小。
  • nmemb:要写入的数据块数量。
  • 返回值:实际写入的块数。

示例:写入和读取二进制文件

#include <stdio.h>

struct Person {
    char name[20];
    int age;
};

int main() {
    FILE *file = fopen("people.dat", "wb");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    struct Person p1 = {"Alice", 25};
    fwrite(&p1, sizeof(struct Person), 1, file); // 写入二进制数据
    fclose(file);

    // 读取二进制文件
    file = fopen("people.dat", "rb");
    if (file != NULL) {
        struct Person p2;
        fread(&p2, sizeof(struct Person), 1, file); // 读取二进制数据
        printf("姓名: %s, 年龄: %d\n

", p2.name, p2.age);
        fclose(file);
    }

    return 0;
}

3. 文件的定位与指针操作

3.1 ftell

ftell 返回文件指针当前位置的偏移量。

long ftell(FILE *stream);

3.2 fseek

fseek 设置文件指针位置。

int fseek(FILE *stream, long offset, int whence);
  • offset:相对位置偏移量。
  • whence:参考位置(SEEK_SETSEEK_CURSEEK_END)。

3.3 rewind

rewind 将文件指针重置为文件开头。

void rewind(FILE *stream);

4. 文件错误处理

4.1 ferror

ferror 函数用于检查文件流是否有错误。

int ferror(FILE *stream);

4.2 feof

feof 函数用于检查文件是否到达末尾。

int feof(FILE *stream);

示例:检测文件末尾

FILE *file = fopen("example.txt", "r");
if (file != NULL) {
    while (!feof(file)) {
        // 文件操作...
    }
    fclose(file);
}

通过以上操作,C 语言中的文件处理能力得到了系统性的展示,不论是文本文件还是二进制文件,都可以通过上述方法实现灵活的读写操作。

评论区
评论列表
menu