深入理解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语言之旅就到此结束了,大家可以持续关注数据结构等专栏。

相关推荐
Light601 分钟前
领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度
linux·pdf·可观测性·异步队列·plt转pdf·权限治理·进度查询
鳄鱼杆19 分钟前
服务器 | Docker应用开发与部署的实践以及阿里云镜像加速配置
服务器·阿里云·docker
羚羊角uou25 分钟前
【Linux】命名管道
linux·运维·服务器
索迪迈科技36 分钟前
基于野火F407开发板实现电源管理-停止模式
c语言·stm32·单片机·嵌入式硬件·mcu
IT 小阿姨(数据库)1 小时前
PgSQL监控死元组和自动清理状态的SQL语句执行报错ERROR: division by zero原因分析和解决方法
linux·运维·数据库·sql·postgresql·centos
THMAIL1 小时前
量化股票从贫穷到财务自由之路 - 零基础搭建Python量化环境:Anaconda、Jupyter实战指南
linux·人工智能·python·深度学习·机器学习·金融
曾经的三心草1 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
小莞尔1 小时前
【51单片机】【protues仿真】基于51单片机宠物投食系统
c语言·stm32·单片机·嵌入式硬件·51单片机
让子弹飞021 小时前
36.2Linux单总线驱动DS18B20实验(详细讲解代码)_csdn
linux·ubuntu·驱动的分离和分层
Yana.nice1 小时前
yum list 和 repoquery的区别
linux