news 2026/4/17 18:14:20

C语言 文件的操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言 文件的操作

文章目录

    • 为什么使用文件
    • 什么是文件
      • 文件名
      • 程序文件
      • 数据文件
    • 文件的打开和关闭
        • 标准流
      • 文件指针
      • 文件的打开和关闭
    • 文件的随机读写
    • 文件读取结束的判定
      • feof与ferror
    • 文件缓冲区

为什么使用文件

如果没有文件操作,程序运行时的数据存储在内存中,当程序运行结束时就会回收内存,数据清空,如果想要永久保留数据就需要将数据存储到文件中

什么是文件

文件名

每个文件要有一个唯一的文件标识,以便用户识别和引用
文件名包含三部分,文件路径+文件主干名+文件后缀
例如 c:\code\test.txt
为了方便起见,文件标识常被称为作文件名

在程序设计中谈论的文件主要是程序文件与数据文件

程序文件

程序文件包括源文件(后缀是.c),目标文件(windows环境下后缀是.obj),可执行程序(windows环境下后缀是.exe)

数据文件

数据文件分为文本文件与二进制文件
程序运行时数据在内存中以二进制形式存储,如果不加转换直接存储到文件中就是二进制文件,如果转换成ASCⅡ形式存储到文件中就是文本文件

字符一律以ASCⅡ形式存储,数值型可以二进制存储也可以ASCⅡ形式存储

如有整数10000,如果以ASCⅡ形式输出到磁盘,磁盘占用5个字节(每个字符占一个字节),如果按二进制形式存储,则只需要4个字节

文件的打开和关闭

我们程序的数据需要输出到各种外部设备中,也需要从各种外部设备中读取数据,不同的设备输入输出操作也不同,为了方便程序员对不同设备的操作,我们抽象出了流的概念,可以将流想象成流淌着字符的河
C程序对文件,画面,键盘的数据进行输入输出操作都需要通过流操作
通常想要从流中写数据或是从流中读取数据,都先需要打开流,然后操作

标准流

那为什么我们并没有打开流,依然能从键盘中读取数据和将数据输出到屏幕呢
那是因为C程序启动时默认打开了三个流

  1. stdin 标准输入流,大多数情况从键盘输入
  2. stdout 标准输出流,大多数情况输出到显示器界面
  3. stderr 标准错误流,大多数情况输出到显示器界面

平时使用的scanf与printf都是通过这三个流操作的
stdin stdout stderr这三个流类型都是FILE* ,通常称为文件指针
C语言中,就是通过FILE*的文件指针来维护各种流的操作的

文件指针

缓冲文件系统中,关键概念是文件类型指针,简称为文件指针
每个被使用的文件,内存都会开辟相应的文件信息区来存放文件的相关信息(比如文件名,文件当前位置等),这些信息保存在结构体变量中,这类结构体类型由系统声明,取名为FILE

例如在vs2013编译环境提供的stdio.h头文件中有以下声明

struct_iobuf{char*_ptr;int_cnt;char*_base;int_flag;int_file;int_charbuf;int_bufsiz;char*_tmpfname;};typedefstruct_iobufFILE;

不同的编译器FILE包含的内容不完全相同,但大同小异
每打开一个文件,系统根据文件信息自动创建一个FILE结构的变量,并自动填充,使用者无需过多关注
通常使用FILE类型的指针对FILE结构的变量进行维护
定义一个FILE类型的指针,指针指向某个文件的文件信息区,通过该文件信息区能够访问该文件,也就是说可以通过FILE*间接访问文件

文件的打开和关闭

文件在读写之前要先打开文件,结束后要关闭文件
打开文件同时会返回指向该文件的文件指针,这样就建立起了指针与文件的联系
ANSI C规定使用fopen打开文件,fclose关闭文件

FILE*fopen(constchar*filename,constchar*mode);intflose(FILE*stream);

mode表示文件的打开模式,以下都是文件的打开模式

示例代码

#include<stdio.h>intmain(){FILE*pf=fopen("filename","r");if(NULL==pf){perror("fopen:");return1;}fclose(pf);pf=NULL;return0;}

顺序读写函数介绍

文件的随机读写

  1. fseek
    int fseek ( FILE * stream, long int offset, int origin );
    根据文件光标的位置和偏移量来定位文件光标
    文件光标的位置有SEEK_SET SEEK_CUR SEEK_END
#include<stdio.h>intmain(){FILE*pf=fopen("example.txt","wb");if(NULL==pf){perror("fopen");return1;}fputs("This is an apple.",pFile);//9是偏移量 SEEK_SET是文件光标位置fseek(pf,9,SEEK_SET);fputs(" sam",pFile);fclose(pf);pf=NULL;return0;}
  1. ftell
    long int ftell ( FILE * stream );
    返回文件指针相对起始位置的偏移量
#include<stdio.h>intmain(){longsize;FILE*pf=fopen("myfile.txt","rb");if(NULL==pf){perror("Error opening file");return1;}fseek(pf,0,SEEK_END);// non-portablesize=ftell(pf);fclose(pf);pf=NULL;printf("Size of myfile.txt: %ld bytes.\n",size);return0;}
  1. rewind
    void rewind(FILE * stream);
    让⽂件指针的位置回到⽂件的起始位置
intmain(){intn;charbuffer[27];FILE*pf=fopen("myfile.txt","w+");for(n='A';n<='Z';n++)fputc(n,pf);rewind(pf);fread(buffer,1,26,pf);fclose(pf);pf=NULL;buffer[26]='\0';printf(buffer);return0;}

文件读取结束的判定

feof与ferror

int feof(FILE* stream);
用来检测文件读取结束是否是因为读取到末尾
int ferror(FILE* stream);
用来检测文件读取结束是否是因为读取错误

#include<stdio.h>intmain(){FILE*pf=fopen("text.txt","r");if(NULL==pf){perror("fopen:");return1;}while(fgetc(pf)!=EOF);if(feof(pf)){printf("读取到末尾\n");}elseif(ferror(pf)){printf("读取错误\n");}fclose(pf);pf=NULL;return0;}

文件读取结束时,判断返回值
fgetc判断返回值是否是EOF
fgets判断返回值是否是NULL
fread判断返回值是否小于实际要读的个数

文件缓冲区

ANSIC 标准采用缓冲文件系统来处理数据文件,缓冲文件系统就是系统自动为打开的文件在内存中开辟一快文件缓冲区。从内存中向磁盘输入数据会先将数据存放在缓冲区中,等缓冲区满后,再一并将数据输入磁盘。磁盘向计算机读入数据,先将数据存放在内存缓冲区中,当缓冲区满时再逐个将数据输入程序数据区

因为有缓冲区的存在,在C语言操作文件时,需要主动进行缓冲区刷新或者关闭文件,否则可能导致文件读写错误

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:14:20

大模型开发必备:8个实用工具与框架详解

这篇文章介绍了8个大模型相关的实用工具与框架&#xff0c;包括微调代码库、可视化界面Langflow、声纹处理工具3D-Speaker、高性能推理引擎KsanaLLM、零成本搜索训练框架ZeroSearch、音频生成框架ThinkSound、搜索能力提升框架MaskSearch以及推理优化扩展LMCache。这些工具覆盖…

作者头像 李华
网站建设 2026/4/17 3:02:58

笨人小白的温故知新——排序(2)

这是一个一题多解的博客&#xff01;下面是一道很简单的题&#xff1a; 1177&#xff1a;奇数单增序列 题目描述】 给定一个长度为N&#xff08;不大于500&#xff09;的正整数序列&#xff0c;请将其中的所有奇数取出&#xff0c;并按升序输出。 【输入】 第1行为 N&#xf…

作者头像 李华
网站建设 2026/4/16 14:34:11

学生党必备!2个真正免费降AI率的工具,亲测知网AIGC检测通过

2个实测免费的降AIGC率工具&#xff0c;顺利通过ai率查重&#xff01; AI 检测本身就没有公开算法&#xff0c;降 AI 工具更像黑箱。如果降AI率连一次免费试用都不给&#xff0c;那风险太大了。万一AI率没有降下来&#xff0c;又不能退&#xff0c;少则几元多则几十。 对于学…

作者头像 李华
网站建设 2026/4/14 17:15:58

Function Calling

文章目录Function Calling在大模型中的作用Function Calling在大模型中的作用 扩展模型能力 大模型本身无法直接操作外部系统&#xff08;如数据库、计算工具&#xff09;&#xff0c;但通过调用预设函数&#xff0c;可以完成&#xff1a; 实时数据获取&#xff08;天气、股价…

作者头像 李华
网站建设 2026/4/15 8:13:57

mysql | 环境变量问题及其配置方法详解

前言 当安装 mysql 环境时&#xff0c;没有选择配置环境变量情况下&#xff1a; 直接打开命令提示符&#xff08;cmd&#xff09;窗口运行 mysql 命令&#xff0c;会出现以下报错&#xff1a; ‘mysql’不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。如下…

作者头像 李华