深入理解C语言文件操作

目录:

一、为什么使用文件?

在编程中,文件操作是不可或缺的一部分。文件可以用于持久化存储数据,使得数据在程序运行结束后仍然可以被保存和读取。无论是配置文件、日志文件还是用户数据,文件操作都为我们提供了灵活且强大的数据管理方式。(以下代码有什么文件函数不懂的,下面有详细的讲解)

二、什么是文件?

文件是存储在外部存储介质(如硬盘、U盘等)上的一组相关数据的集合。在C语言中,文件可以分为以下几类:

  1. 程序文件 :包含程序源代码的文件,如 .c 文件。
  2. 数据文件:用于存储程序运行时产生的数据,如日志文件、配置文件等。
  3. 文件名 :文件的唯一标识符,通常由文件名和扩展名组成,如 data.txt

三、文件的打开和关闭

1. 文件指针

在C语言中,文件操作通过文件指针(FILE*)进行。文件指针是一个指向文件结构体的指针,用于管理文件的读写操作。

c 复制代码
FILE *fp;

2. 文件的打开和关闭

文件的打开和关闭是文件操作的基本步骤。使用 fopen 函数打开文件,使用 fclose 函数关闭文件。

c 复制代码
#include <stdio.h>

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

    // 文件操作

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

四、文件的顺序读写

文件的顺序读写是指按照文件内容的顺序进行读取或写入操作。常用的函数包括 fprintffscanffgetsfputs

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "w");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    fprintf(fp, "Hello, World!\n"); // 写入文件

    fclose(fp);

    fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    char buffer[100];
    fgets(buffer, 100, fp); // 读取文件
    printf("%s", buffer);

    fclose(fp);
    return 0;
}

五、fseek函数

fseek 函数用于移动文件指针到指定位置。它常用于随机访问文件内容。

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "w+");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    fprintf(fp, "Hello, World!\n");

    fseek(fp, 0, SEEK_SET); // 将文件指针移动到文件开头

    char buffer[100];
    fgets(buffer, 100, fp);
    printf("%s", buffer);

    fclose(fp);
    return 0;
}

六、ftell函数

ftell 函数用于获取当前文件指针的位置。

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "w+");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    fprintf(fp, "Hello, World!\n");

    long pos = ftell(fp); // 获取当前文件指针位置
    printf("当前文件指针位置: %ld\n", pos);

    fclose(fp);
    return 0;
}

七、rewind函数

rewind 函数用于将文件指针重置到文件开头。

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "w+");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    fprintf(fp, "Hello, World!\n");

    rewind(fp); // 将文件指针重置到文件开头

    char buffer[100];
    fgets(buffer, 100, fp);
    printf("%s", buffer);

    fclose(fp);
    return 0;
}

八、文本文件和二进制文件

C语言支持两种文件类型:文本文件和二进制文件。文本文件以字符形式存储数据,而二进制文件以二进制形式存储数据。

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.bin", "wb"); // 以二进制写入模式打开文件
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    int data = 12345;
    fwrite(&data, sizeof(int), 1, fp); // 写入二进制数据

    fclose(fp);

    fp = fopen("example.bin", "rb"); // 以二进制读取模式打开文件
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    int read_data;
    fread(&read_data, sizeof(int), 1, fp); // 读取二进制数据
    printf("读取的数据: %d\n", read_data);

    fclose(fp);
    return 0;
}

九、文件读取结束的判定

在文件读取过程中,使用 feof 函数判断文件是否读取结束。需要注意的是,feof 函数在文件读取结束时返回非零值,但在读取错误时也会返回非零值。

c 复制代码
#include <stdio.h>

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

    char buffer[100];
    while (fgets(buffer, 100, fp) != NULL) {
        printf("%s", buffer);
    }

    if (feof(fp)) {
        printf("文件读取结束\n");
    } else {
        printf("文件读取错误\n");
    }

    fclose(fp);
    return 0;
}

十、文件缓冲区

文件缓冲区是操作系统用于提高文件读写效率的一种机制。C语言提供了 setvbuf 函数来设置文件缓冲区。

c 复制代码
#include <stdio.h>

int main() {
    FILE *fp;
    fp = fopen("example.txt", "w");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    char buffer[1024];
    setvbuf(fp, buffer, _IOFBF, 1024); // 设置文件缓冲区

    fprintf(fp, "Hello, World!\n");

    fclose(fp);
    return 0;
}

文件函数的参数和使用方法

1. fopen 函数

c 复制代码
FILE *fopen(const char *filename, const char *mode);
  • filename:文件名,可以是相对路径或绝对路径。
  • mode:文件打开模式,如 "r"(只读)、"w"(写入,文件不存在则创建)、"a"(追加)等。

2. fclose 函数

c 复制代码
int fclose(FILE *stream);

stream:文件指针。

3. fprintf 函数

c 复制代码
int fprintf(FILE *stream, const char *format, ...);
  • stream:文件指针。
  • format:格式化字符串。
  • ...:可变参数列表。

4. fscanf 函数

c 复制代码
int fscanf(FILE *stream, const char *format, ...);
  • stream:文件指针。
  • format:格式化字符串。
  • ...:可变参数列表。

5. fgets 函数

c 复制代码
char *fgets(char *str, int n, FILE *stream);
  • str:存储读取内容的字符串。
  • n:最大读取字符数。
  • stream:文件指针。

6. fputs 函数

c 复制代码
int fputs(const char *str, FILE *stream);
  • str:要写入的字符串。
  • stream:文件指针。

7. fseek 函数

c 复制代码
int fseek(FILE *stream, long offset, int origin);
  • stream:文件指针。
  • offset:偏移量。
  • origin:起始位置,如 SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。

8. ftell 函数

c 复制代码
long ftell(FILE *stream);
  • stream:文件指针。

9. rewind 函数

c 复制代码
void rewind(FILE *stream);
  • stream:文件指针。

10. fwrite 函数

c 复制代码
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:要写入的数据指针。
  • size:每个数据项的大小。
  • nmemb:数据项的数量。
  • stream:文件指针。

11. fread 函数

c 复制代码
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr:存储读取数据的指针。
  • size:每个数据项的大小。
  • nmemb:数据项的数量。
  • stream:文件指针。

12. feof 函数

c 复制代码
int feof(FILE *stream);
  • stream:文件指针。

13. setvbuf 函数

c 复制代码
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
  • stream:文件指针。
  • buf:缓冲区指针。
  • mode:缓冲模式,如 _IOFBF(全缓冲)、_IOLBF(行缓冲)、_IONBF(无缓冲)。
  • size:缓冲区大小。

总结

C语言的文件操作提供了丰富的功能,从文件的打开和关闭到文件的读写,再到文件指针的移动和缓冲区的设置,每一步都为程序员提供了灵活且强大的工具。通过深入理解这些操作,我们可以更好地管理和处理文件数据,从而提高程序的效率和可靠性。此时,我们的C语言之旅就到此结束了,大家可以持续关注数据结构等专栏。

相关推荐
W说编程1 分钟前
算法导论第二十四章 深度学习前沿:从序列建模到创造式AI
c语言·人工智能·python·深度学习·算法·性能优化
来一杯龙舌兰2 小时前
【Kubernetes】从零搭建K8s集群:虚拟机环境配置全指南(DNS/网络/防火墙/SELinux全解析一站式配置图文教程)
linux·网络·kubernetes
穆易青2 小时前
2025.06.20【pacbio】|使用Snakemake构建可重复的PacBio全基因组甲基化分析流程
java·运维·服务器
A.A呐3 小时前
【Linux第四章】gcc、makefile、git、GDB
linux·c语言·开发语言·c++·git
努力成为DBA的小王3 小时前
CVE-2024-6387漏洞、CVE-2025-26465漏洞、CVE-2025-26466漏洞 一口气全解决
运维·服务器
C羊驼4 小时前
C语言:排序算法
c语言·算法·排序算法
A-花开堪折4 小时前
01-驱动开发开篇
linux·嵌入式硬件
大熊程序猿4 小时前
quartz 表达式最近10次执行时间接口编写
java·服务器·前端
程序员JerrySUN6 小时前
Linux 内核同步管理全解:原理 + 实战 + 考点
linux·运维·服务器