欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > C语言文件操作深度解析:从基础到实践

C语言文件操作深度解析:从基础到实践

2025/2/28 1:33:01 来源:https://blog.csdn.net/nplplus/article/details/145886834  浏览:    关键词:C语言文件操作深度解析:从基础到实践

在C语言的学习和应用中,文件操作是一项极为重要的技能。它能够让程序与外部存储设备进行数据交互,实现数据的持久化存储和读取。今天,我们就围绕“C语言文件操作”展开深入探讨,对应图片中的8个重点内容,为大家带来全面且实用的讲解。


目录

一、为什么使用文件 

二、什么是文件 

三、文件的打开和关闭 

四、文件的顺序读写 

五、文件的随机读写 

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

七、文件读取结束的判定 

八、文件缓冲区 


一、为什么使用文件
 

在程序运行过程中,数据通常存储在内存里,一旦程序结束,这些数据就会丢失。而文件则可以将数据长期保存在外部存储介质(如硬盘)上,方便下次程序运行时读取,实现数据的持久化。比如,学生成绩管理系统中,学生的成绩信息需要长期保存,就可以通过文件操作来实现。此外,文件还能用于不同程序之间的数据共享,以及记录程序的运行日志等。
 



二、什么是文件
 

从操作系统的角度来看,文件是存储在外部存储设备上的一组相关数据的集合,有自己的文件名和存储路径。在C语言中,文件分为文本文件二进制文件文本文件以字符形式存储数据,每个字符对应一个ASCII码值;二进制文件则以二进制形式存储数据,与内存中数据的存储形式一致。
 



三、文件的打开和关闭
 

在C语言中,使用 fopen 函数打开文件, fclose 函数关闭文件。 fopen 函数的原型为:
 



c
  
FILE *fopen(const char *filename, const char *mode);
 

 filename 是要打开的文件名(包含路径), mode 是文件的打开模式,如 "r" (只读)、 "w" (只写,会清空原有内容)、 "a" (追加)等。 fclose 函数原型为:



c  
int fclose(FILE *stream);

 stream 是 fopen 函数返回的文件指针。
示例代码:
 



c
  
#include <stdio.h>
int main() {
    FILE *fp;
    fp = fopen("test.txt", "w");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }
    // 文件操作代码
    fclose(fp);
    return 0;
}
 

四、文件的顺序读写
 

顺序读写是按照文件中数据的存储顺序依次进行读取或写入操作。常见的函数有 fputc (写入一个字符)、 fgetc (读取一个字符)、 fputs (写入一个字符串)、 fgets (读取一个字符串)等。
示例代码(写入字符串):
 



c
  
#include <stdio.h>
int main() {
    FILE *fp;
    fp = fopen("test.txt", "w");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }
    fputs("Hello, C file operation!", fp);
    fclose(fp);
    return 0;
}

示例代码(读取字符串):
 



c  


#include <stdio.h>
#define BUFFER_SIZE 100
int main() {
    FILE *fp;
    char buffer[BUFFER_SIZE];
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }
    fgets(buffer, BUFFER_SIZE, fp);
    printf("%s", buffer);
    fclose(fp);
    return 0;
}

五、文件的随机读写
 

随机读写允许我们在文件的任意位置进行读取或写入操作,通过 fseek 函数来定位文件指针, ftell 函数获取文件指针当前位置, rewind 函数将文件指针复位到文件开头。 fseek 函数原型为:
 



c


int fseek(FILE *stream, long int offset, int origin); 


 stream 是文件指针, offset 是偏移量, origin 是起始位置( SEEK_SET 文件开头、 SEEK_CUR 当前位置、 SEEK_END 文件末尾)。


示例代码(定位到文件中间位置读取数据):
 



c  


#include <stdio.h>
int main() {
    FILE *fp;
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }
    fseek(fp, 5, SEEK_SET);  // 定位到第6个字符位置
    char ch;
    ch = fgetc(fp);
    printf("%c\n", ch);
    fclose(fp);
    return 0;
}  

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

如前文所述,文本文件和二进制文件存储形式不同。文本文件便于人类阅读和编辑,但在存储数值等数据时可能会有转换损耗;二进制文件存储效率高,能准确存储各种数据类型,但不便于直接查看内容。以存储整数 100 为例:


c


#include <stdio.h>
int main() {
    // 写入文本文件
    FILE *text_fp = fopen("text.txt", "w");
    if (text_fp == NULL) {
        perror("文本文件打开失败");
        return 1;
    }
    fprintf(text_fp, "%d", 100);
    fclose(text_fp);

    // 写入二进制文件
    FILE *bin_fp = fopen("bin.bin", "wb");
    if (bin_fp == NULL) {
        perror("二进制文件打开失败");
        return 1;
    }
    int num = 100;
    fwrite(&num, sizeof(int), 1, bin_fp);
    fclose(bin_fp);

    return 0;
}

七、文件读取结束的判定
 

常用的判定方法有:对于文本文件,使用 feof 函数判断是否到达文件末尾,当 feof 函数返回非零值时表示到达文件末尾;对于二进制文件,通过 fread 等函数的返回值来判断读取是否结束,若返回值小于要读取的元素个数,则表示读取结束
示例代码(文本文件):
 



c  


#include <stdio.h>
int main() {
    FILE *fp;
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }
    int ch;
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }
    fclose(fp);
    return 0;
}
 


八、文件缓冲区
 

为了提高文件读写效率,C语言为每个打开的文件都设置了一个缓冲区。在写入文件时,数据先写入缓冲区,当缓冲区满或文件关闭时,数据才真正写入外部存储设备;读取文件时,数据先从外部存储设备读取到缓冲区,然后再从缓冲区读取到程序变量中。可以使用 fflush 函数来强制刷新缓冲区,将缓冲区中的数据立即写入文件。
 


c
  
#include <stdio.h>
int main() {
    FILE *fp;
    fp = fopen("test.txt", "w");
    if (fp == NULL) {
        perror("文件打开失败");
        return 1;
    }
    fputs("立即写入数据", fp);
    fflush(fp);  // 强制刷新缓冲区
    fclose(fp);
    return 0;

通过对以上C语言文件操作重点内容的详细讲解和示例代码演示,相信大家对C语言文件操作有了更深入的理解和掌握。在实际编程中,合理运用这些知识,能让我们的程序更加完善和强大。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词