已完结:C语言对文件的操作(代码)

0.注意

(1)记得" "内填 \ \ 两个 “\” ,如果example.txt和.cpp在一个文件夹直接用即可。

(2)标准库函数:fgets 是 C 标准库中的一个函数,定义在 stdio.h 头文件中。其声明如下:

char *fgets(char *str, int n, FILE *stream);
  • char *str: 用于存储读取内容的缓冲区(即字符数组)。如果读取成功,fgets 会将字符存入该数组。
  • int n: 最大读取字符数。它表示最多可以读取 n-1 个字符(因为要留出一个字符的位置给 \0,即字符串的终止符)。
  • FILE *stream: 指向文件或输入流的指针。通常是通过 fopen 打开的文件,或者是标准输入流 stdin

(3)SEEK_SETSEEK_END 这两个常量是由 C 语言标准库 提供的,定义在 <stdio.h> 头文件中,专门用于 fseek 函数中的 whence 参数。它们是用来指定文件指针(FILE *)相对于哪个位置进行偏移的常量。

  • SEEK_SET:文件指针相对于文件的开头位置移动。
  • SEEK_END:文件指针相对于文件的末尾位置移动。
  • SEEK_CUR:文件指针相对于当前位置移动。

(4)关于EOF,ch = fgetc(file)) != EOF 是正确的写法,而不能将 EOF 替换为 NULL

  • EOF 用于表示文件结束或读取错误,适用于文件流读取的场景。
  • NULL 用于表示指针为空,不适用于 fgetc 的返回值判断。
  • 在判断 fgetc 结果时,必须使用 EOF 来检查是否到达文件末尾,而不能使用 NULL

1. 打开文件

在 C 语言中,使用 fopen 函数来打开文件。该函数返回一个指向 FILE 类型的指针。

#include <stdio.h>

int main() {
    FILE *file;

    // 打开文件用于写入,如果文件不存在会创建一个新文件
    file = fopen("example.txt", "w");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 执行文件操作...

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

2. 写入文件

使用 fprintffputs 来向文件写入数据。

fscanf

  • fscanf 用于从文件中读取格式化的数据,类似于 scanf
  • 它允许你指定格式控制符(例如 %d%s%f 等),并根据这些格式控制符从文件中提取数据。

fgets

  • fgets 用于从文件中读取一行文本,包括空格和制表符。
  • 它会读取直到遇到换行符(\n)或达到指定的字符数为止。
  • fgets 读取到的内容会保存在指定的字符数组中,并且会包括换行符(如果有的话),如果读取的字符数达到了最大限制,它会自动终止字符串。

//运行完你就会发现多了三句话了!

#include <stdio.h>

int main() {
    FILE *file;

    file = fopen("example.txt", "w"); // 打开文件用于写入

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 使用 fprintf 写入格式化数据
    fprintf(file, "Hello, World!\n");
    fprintf(file, "This is a test file.\n");

    // 或者使用 fputs 写入字符串
    fputs("Another line of text.\n", file);

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

3. 读取文件

使用 fscanffgets 来从文件读取数据。

#include <stdio.h>

int main() {
    FILE *file;
    char buffer[100];

    file = fopen("example.txt", "r"); // 打开文件用于读取

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 使用 fgets 逐行读取文件
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

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

4. 追加内容到文件

使用 "a" 模式打开文件,可以在文件末尾追加内容。

#include <stdio.h>

int main() {
    FILE *file;

    file = fopen("example.txt", "a"); // 以追加模式打开文件

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    fprintf(file, "This line is appended.\n");

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

5. 文件指针位置操作

使用 fseekftell 来控制文件指针的位置。

#include <stdio.h>

int main() {
    FILE *file;
    char buffer[100];

    file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    // 定位到文件的末尾
    fseek(file, 0, SEEK_END);
    long length = ftell(file); // 获取文件大小ftell(file) 返回文件指针当前的位置(即文件末尾的位置)。由于文件指针已经被定位到文件末尾,ftell(file) 返回的是文件的 总字节数,即文件的大小。length 变量用来存储文件大小。
    printf("文件大小:%ld 字节\n", length);

    // 定位到文件开头
    fseek(file, 0, SEEK_SET);

    // 读取文件内容
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

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

6. 文件的错误处理

当进行文件操作时,可能会遇到错误,需要进行错误检查。可以通过 ferrorfeof 来检查文件读取错误和是否到达文件末尾。

//直接ferror(指针)feof(指针)这样用就行,指针即FILE *file

#include <stdio.h>

int main() {
    FILE *file;
    char buffer[100];

    file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    // 检查文件是否已到达末尾
    if (feof(file)) {
        printf("\n已到达文件末尾\n");
    }

    // 检查是否有读取错误
    if (ferror(file)) {
        printf("读取文件时发生错误\n");
    }

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

7. 删除文件

使用 remove 函数删除文件。

#include <stdio.h>

int main() {
    if (remove("example.txt") == 0) {
        printf("文件删除成功\n");
    } else {
        printf("文件删除失败\n");
    }

    return 0;
}

8.总结

  • fopen 用于打开文件,fclose 用于关闭文件。
  • fprintffputs 用于写入数据,fscanffgets 用于读取数据。
  • 使用 fseekftell 来控制文件指针的位置。
  • 可以通过检查 feofferror 来判断文件是否读取完毕或发生了错误。

猜你喜欢

转载自blog.csdn.net/qq_58645222/article/details/144327563