news 2026/4/23 2:41:27

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/23 10:53:28

Java 集合框架核心用法与实战技术笔记

一、集合框架核心组件概览 Java 集合框架&#xff08; java.util 包&#xff09;核心分为三大接口工具类体系&#xff0c;适配不同数据存储与操作场景&#xff1a; List&#xff1a;有序可重复&#xff0c;支持随机访问&#xff0c;主流实现包括基于数组的 ArrayList 和基于…

作者头像 李华
网站建设 2026/4/23 11:51:28

JIS-CTF-vulnupload靶场实验,拿下靶机flag(从渗透到提权全攻略)

实验目的&#xff1a;掌握nmap、dirb等工具的使用&#xff0c;掌握单主机渗透常规思路。软件工具&#xff1a;Nmap&#xff0c;dirb &#xff0c;AntSword实验目标&#xff1a;获得flag实验步骤&#xff1a;信息收集在kali中打开终端&#xff0c;使用nmap工具对目标机器进行扫描…

作者头像 李华
网站建设 2026/4/23 11:53:22

动态规划算法

假设你正在爬楼梯&#xff0c;每次可以爬1个或2个台阶。请问&#xff0c;到达第n个台阶有多少种不同的方法&#xff1f;面对这个问题&#xff0c;很多人会陷入复杂的排列组合计算中。但如果我们换个思路&#xff1a;要想到达第n个台阶&#xff0c;你只能从第n-1个台阶爬1步上来…

作者头像 李华
网站建设 2026/4/23 6:31:37

lanchain高级

ReAct范式 ReAct范式是一种用于增强人工智能模型的推理能力的框架,结合了反应(Reaction)和行动(Action)。它主要通过让模型在处理复杂问题时,能够生成更为详细和准确的响应。ReAct方法通常涉及以下几个步骤: 反应:模型首先根据输入信息做出初步反应,提出相关的问题或…

作者头像 李华
网站建设 2026/4/23 11:52:17

断路器,空开,漏电开关

断路器1.断路器属于被动型、一般不作频繁使用的保护开关装置。2.断路器通常适用于220V以上的各电压等级。一般断路器能承受的负荷及短路电流更大些。3.断路器根据它的灭弧介质不同&#xff0c;可以分为空气断路器、油浸式断路器和六氟化硫断路器。4.断路器是可以接通和分断电流…

作者头像 李华