C语言之文件操作

article/2025/10/11 19:33:32

目录

为什么使用文件

文件名

文件指针

流 

文件的打开和关闭

前言

文件的打开方式

文件打开关闭函数

fopen函数

fclose函数

文件的顺序读写

fputc函数

fgetc函数

fputs函数

fgets函数

fprintf函数

fscanf函数

fwrite函数

fread函数

文件的随机读写

fseek函数

ftell函数

rewind函数

文本文件和二进制文件

一个数据在内存中怎么储存

文件读取结束的判定

feof函数

文件缓冲区

理解:

fflush函数

为什么使用文件

使用文件我们可以将数据直接存放在电脑硬盘上,做到了数据的持久化

在程序设计中,我们一涉及的两种文件

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

数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件

注意:本章讨论的主要是数据文件

文件名

定义:一个文件有一个唯一的文件标识,以便用户识别和引用

文件名包含3部分:文件路径+文件名主干+文件后缀

eg:c:\code\test,txt

文件指针

定义:缓冲文件系统中,关键的概念是文件类型指针,简称文件指针。

关于FILE

每个被使用的文件都在内存中开辟一个文件信息区,用来存放文件的相关信息(如文件名,文件状态以及文件的当前位置等)。这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的,取名为FILE

关于VS2013编译环境提供的stdio.h头文件中有以下的文件类型申明

typedef struct _iobuf {char* _ptr;         //文件输出的下一个位置int _cut;			//当前缓冲区的相对位置char* _base;		//指基础位置,文件的起始位置int _flag;			//文件标志int _file;			//文件有效性检查int _charbuf;		//检查缓冲区状况,如果无缓冲区则不读取int _bufsiz;		//文件的大小char* _tmpfname;	//临时文件名
}FILE;

注意:

  • 不同C编译器的FILE类型包含的内容不完全相同,但是大同小异
  • 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构类型的变量,并填充其中的信息,使用者不必关心细节
  • 一般都是通过一个FILE指针来维护这个结构的变量,这样使用起来更加方便        

创建一个FILE* 的指针变量

FILE* pf;//文件指针变量

定义的pf是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。

通过文件指针变量可以找到与他相关联的文件 

流 

流:程序数据可能要操作各种各样的硬件(如:硬盘、光盘、u盘等)硬件的不同导致了其读写方式的不同,因为要记硬件读写方式的成本过高,所以就在中间层抽象一个流(其是一个标准)的概念,此时程序向流里面输入数据,然后流再把相应的数据写到我们的不同设备中,因而我们程序员就不用关心硬件读写方式了。

C语言程序只要运行起来,就默认打开了3个流

  • stdin——标准输入流——对应键盘
  • stdout——标准输出流——对应屏幕
  • stderr——标准错误流——对应屏幕

文件的打开和关闭

前言

  • 文件在读写之前应该打开文件,在使用结束后应该关闭文件
  • 在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也就相当于建立了指针和文件的关系
  • ANSIC规定使用fopen函数打开文件,使用fclose函数关闭文件

文件的打开方式

文件打开关闭函数

fopen函数

当用fopen打开一个文件的时候,其会主动创建该文件的文件信息区 ,并且把这个文件信息区的起始地址返回过来,如果打开失败则返回null

参数:filename:传入的文件名        mode:文件的打开方式

fclose函数

注意:使用fclose函数就可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区 

传入参数为文件类型的指针 

返回值:如果成功关闭则返回0,否则返回eof(-1) 

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("C:\\All\\test.txt", "w");//(绝对路径)打开文件if (pf==NULL){perror("fopen");}fclose(pf);//关闭文件pf = NULL;
}

文件的顺序读写

注意:内存中的数据输出到硬盘中的过程叫写入,硬盘中的数据输入到内存中的过程叫读取 

fputc函数

写一个字符到一个流里面,具体要写ASCII码值为c的字符,stream是具体写到哪个地址的文件中

当写入成功时返回写入的字符,当写入失败时返回EOF(文件结束标志)

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("test.txt", "w");//打开文件if (pf==NULL){perror("fopen");}char c[] = "hello world";for (int i = 0; i <= 11; i++){printf("%c",fputc(c[i], pf));}fclose(pf);//关闭文件pf = NULL;
}//hello world

fgetc函数

在stream文件地址处的文件里读取一个字符,如果读取正常就返回该字符的ASCII码值,如果读取失败或遇到EOF则返回EOF

注意:当打开文件并使用fgetc函数读取文件时,fgetc函数从文件的开始位置读取一个字符,每读取一个字符后文件的位置指针向后移动一个字符的位置。若当前读取的是文本文件,当遇到文件结束时返回值为EOF

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("test.txt", "r");//打开文件if (pf==NULL){perror("fopen");}//读取文件printf("%c", fgetc(pf));//hprintf("%c", fgetc(pf));//eprintf("%c", fgetc(pf));//lprintf("%c", fgetc(pf));//lprintf("%c", fgetc(pf));//ofclose(pf);//关闭文件pf = NULL;
}

fputs函数

写一个string字符串到stream文件指针所指向的文件中,如果写入成功则返回非0(默认为1),如果写入错误则返回EOF

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("test.txt", "w");//打开文件if (pf==NULL){perror("fopen");}//写入文件fputs("hi", pf);fputs(" world", pf);fclose(pf);//关闭文件pf = NULL;
}//hi world(写入的是1行如果需要换行则需要在字符串中加'\n')

fgets函数

在stream指针所指向的文件中读取最多n个字符放到string地址所指向的空间中,返回该地址的指针,如果读完或出现错误则返回null

注意:如果n=100,那么读取的实际有99个非'\0'字符,最后一个放'\0'

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("test.txt", "r");//打开文件if (pf==NULL){perror("fopen");}//读取文件char arr[6] = { 0 };printf("%s\n", fgets(arr, 6, pf));//hi woprintf(arr);//hi woprintf("%s\n", fgets(arr, 6, pf));//rldprintf(arr);//rldfclose(pf);//关闭文件pf = NULL;//由此观之再次读取时用该数组接受时数组数据被覆盖
}

fprintf函数

将agars(参数表)内各项的值,按format(格式控制字符串)所表示的格式,将数据格式为字符串的形式写入到文件指针stream所指向的文件中,fprintf函数返回值是输出的字符数,发生错误时返回一个负值

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
struct Stu
{char arr[10];int num;float sc;
};
void main() {FILE* pf = fopen("test.txt", "w");//打开文件if (pf==NULL){perror("fopen");}struct Stu s = { "hello",10,5.5f };fprintf(pf, "%s %d %f", s.arr, s.num, s.sc);//hello 10 5.500000fclose(pf);//关闭文件pf = NULL;
}

fscanf函数

将stream指针所指向的文件的数据以format(格式控制字符串)的形式 读取出来,放到argu各种参数中,对于返回值fscanf函数在没有出错的情况下返回实际读取数据的个数,如果出错或者读到结尾则返回EOF

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
struct Stu
{char arr[10];int num;float sc;
};
void main() {FILE* pf = fopen("test.txt", "r");//打开文件if (pf==NULL){perror("fopen");}struct Stu s = {0};fscanf(pf, "%s %d %f", s.arr, &(s.num), &(s.sc));//第一个也可以&(s.arr)没有取址是因为结构体地址与第一个元素地址0偏移printf("%s %d %f\n", s.arr, s.num, s.sc);//hello 10 5.500000fclose(pf);//关闭文件pf = NULL;
}

fwrite函数

 作用:将一块内存区域中的数据(buffer所指向的内存区域)以二进制的形式写入到本地文本(stream指向的文件)其返回值返回的是实际写入到文件的基本单元个数

    -- buffer:指向数据块的指针  -- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)  -- count:数据个数(最多) -- stream:文件指针  

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
struct Stu
{char arr[10];int num;float sc;
};
void main() {FILE* pf = fopen("test.txt", "w");//打开文件if (pf==NULL){perror("fopen");}struct Stu s = {"hi",10,5.5f};//二进制形式写文件fwrite(&s, sizeof(struct Stu), 1, pf);fclose(pf);//关闭文件pf = NULL;
}

fread函数

将stream指针所对应的文件数据读取到buffer指针所对应的内存区域中,size为单个数据的大小,count为数据的个数,该函数的返回值为实际读取到元素的个数,如果发现要读取到完整的元素个数小于指定的元素个数,这就是最后一次读取,读取失败返回0

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
struct Stu
{char arr[10];int num;float sc;
};
void main() {FILE* pf = fopen("test.txt", "r");//打开文件if (pf==NULL){perror("fopen");}struct Stu s = {0};//二进制形式读文件fread(&s, sizeof(struct Stu), 1, pf);printf("%s %d %f\n", s.arr, s.num, s.sc);//hi 10 5.500000fclose(pf);//关闭文件pf = NULL;
}

文件的随机读写

fseek函数

根据文件指针的位置和偏移量来定位文件指针(调整文件指针)

参数:

stream——针对stream文件地址所对应的文件

offset——偏移量【字节为单位】(负数为向左偏移,正数为向右偏移)

origin——起始位置(从哪开始偏移)

关于起始位置有3个参数

  • SEEK_SET:文件开头
  • SEEK_CUT:当前位置
  • SEEK_END:文件结尾

返回值:成功则返回0,否则返回其他值

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("test.txt", "r");if (pf==NULL){perror("fopen");return;}//读取文件int ch = fgetc(pf);//pf所指向的文件内容为abcdefgprintf("%c\n", ch);//调整文件指针fseek(pf, -1, SEEK_CUR);//pf指向的文件,其指针从当前位置向左偏移1字节ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);//关闭文件fclose(pf);pf = NULL;
}//没加fseek函数时为abc,加了之后为aab
//注意如果遇到换行的情况,说明前一行的字符串末尾有'\0'其也会记在偏移量中

ftell函数

返回文件指针相对于起始位置的偏移量

rewind函数

让文件指针的位置回到文件的起始位置

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
void main() {FILE* pf = fopen("test.txt", "r");if (pf==NULL){perror("fopen");return;}//读取文件int ch = fgetc(pf);//pf所指向的文件内容为abcdefgprintf("%c\n", ch);//调整文件指针fseek(pf, 1, SEEK_CUR);//pf指向的文件,其指针从当前位置向左偏移1字节int a = ftell(pf);//告知文件指针相对于起始位置的偏移量printf("%d\n",a);//2rewind(pf);//让文件指针的位置回到文件的起始位置printf("%d\n",ftell(pf));//0//关闭文件fclose(pf);pf = NULL;
}

文本文件和二进制文件

根据数据的组织形式数据文件称为文本文件和二进制文件

二进制文件:数据在内存中以二进制的形式储存,如果不加转换的输出到外存,就是二进制文件

文本文件:如果要求在外存上以ASCII码的形式储存,则需要在储存前转换,以ASCII字符形式储存的文件就是文本文件

一个数据在内存中怎么储存

字符一律以ASCII码形式储存,数值型数据既可以用ASCII码形式储存,也可以用二进制形式储存。

10000储存方式

二进制:(共占用4字节)

  • int形式:00000000 00000000 00100111 00010000

ASCII形式:(共占5字节)

  • 00110001 00110000 00110000 00110000 00110000

关于ASCII形式:共5字节每个字节都代表一个ASCII码值分别为(1、0、0、0、0)的ASCII码值

文件读取结束的判定

feof函数

应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾部结束

使用时需引入头文件:#include <stdio.h> 

返回值:若达到文件尾部EOF则返回非0;否则返回0

注意:文件结束标志——end of file(EOF——值为-1) 

文件缓冲区

理解:

fflush函数

调用该函数会将缓冲区中的内容写到stream所指向的文件中去(对于内存缓冲区来说是清空,对于硬盘来说是写入),若stream为null,则会将所有打开的文件进行数据更新。

返回值:如果成功刷新则返回0,指定的流没有缓冲区或者只读打开时也返回0,错误返回-1;

使用:

引入头文件:#include <stdio.h>

#include <stdio.h>
#include <Windows.h>
void main() {FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10s-已经写数据了,发现test.txt里没数据\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区,将输出缓冲区的数据写到文件printf("睡眠10s再次打开test.txt,有内容了。\n");Sleep(10000);//关闭文件也会刷新缓冲区,所以才有第二次睡眠,因为要确定刷新缓冲区的作用fclose(pf);pf = NULL;
}

注意:因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束时关闭文件(文件关闭时也会刷新缓冲区),如果不做可能会导致读写文件的问题。


http://chatgpt.dhexx.cn/article/6ouMaoXH.shtml

相关文章

文件操作(图解)

文件操作 1、文件是什么&#xff1f;1.1 程序文件1.2 数据文件1.3 文件名 2、文件的打开和关闭2.1 文件指针2.2 文件的打开和关闭 3、文件的顺序读写4、文件的随机读写4.1 fseek4.2 ftell4.3 rewind 5、文本文件和二进制文件6、文件读取结束的判定6.1 被错误使用的feof 7、文件…

C++中的文件操作

目录 文件操作C中的文件操作时基于面向对象的C中文件类型分为两种&#xff1a;操作文件的三大类&#xff08;这些类都属于标准模板库&#xff09;:1 文本文件1.1 写文件写文件步骤如下&#xff1a;文件打开方式&#xff1a; 1.2 读文件读取文件数据的四种方式按照喜好记前三个中…

什么是文件操作?为什么要有文件操作?

文章目录 前言一、什么是文件1.1 程序文件1.2 数据文件 二、文件的打开与关闭2.1 文件指针2.2 文件的打开与关闭2.3 文件读写详情表&#xff01;&#xff08;重点&#xff09;2.4 文件的顺序读写&#xff01;&#xff08;重点&#xff09;2.5 文件的随机读写2.5.1 fseek2.5.2 f…

常见文件操作函数

目录 一、文件的打开和关闭 1、文件指针 2、文件打开和关闭 二、文件的顺序读写 1、fgetc()和fputc()函数 2、fgets()和fputs()函数 3、fscanf()和fprintf()函数 4、fread()和fwrite()函数 三、文件的随机读写 1、fseek函数 2、ftell函数 3、rewind函数 四、文本文…

【Linux】Linux的文件操作

文件操作对于不少编程初学者来说都是一件头疼的事情&#xff0c;不管你学习的是什么编程语言&#xff0c;C/C/Java/Go/Python ,因为我们学习到的文件相关的操作对你来说都是一个黑盒&#xff0c;我们只是知道我们应该怎么使用相应的文件函数进行操作&#xff0c;而对于内部的实…

文件操作(详解)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 ​ 3.2 文件的打开和关闭 4. 文件的顺序读写 4.1 对比一组函数&#xff1a; 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind 7. 文件读取结束的…

c语言中的文件操作

目录 引入&#xff1a; 一、文件的打开和关闭 1.文件名 2.文件指针 3.文件的打开和关闭 二、对文件如何操作和流 1.对文件操作相关功能&#xff1a; 2.流 三、文件操作函数(顺序读写) 1."w"输出流&#xff1a; 2."r" 输入流 3."wb"与&…

C语言 文件操作

文件操作在我们的使用中虽然占的不多&#xff0c;但是有些时候&#xff0c;还是需要这部分的知识的。比如&#xff0c;我们做了一个C语言版的售卖系统。现在的想法是在关闭的时候保存这次的结果&#xff0c;然后下一次继续使用&#xff0c;这个时候&#xff0c;就可以使用文件操…

手把手教你学Python之文件操作(一文掌握文件操作)

目录 1、Python中文本文件的读写 2、Python中常用的文件与文件夹操作方法 3、Python中Excel文件的读写 4、Python读取Excel文件案例​ 为了保存数据&#xff0c;方便修改和分享&#xff0c;数据通常以文件的形式存储在磁盘等外部存储介质中。根据逻辑上编码不同可将文件大致…

Linux文件操作

目录 一、系统api与库函数的关系二、open和close函数介绍2.1 open方法介绍2.2 close方法介绍 三、open/create函数创建文件时的权限设置四、read和write函数的介绍和使用4.1 read函数介绍4.2 write函数介绍4.3 如何使用 五、lseek函数的介绍和使用5.1 介绍5.2 如何使用 六、阻塞…

python文件操作(一看就懂)

python文件操作 历史遗留问题文件介绍打开文件转定义字符Python格式化字符串的替代符以及含义Python的转义字符及其含义 &#x1f495;Final~ 历史遗留问题 现在我们接着上文讲&#xff0c;如果没有看过我上篇文章的萌新朋友们可以先去看看&#xff0c;不然一会儿容易读的你满…

Linux的文件操作命令

接下来将介绍Linux中一些常用的文件操作命令&#xff0c;今天先演示五个类型的命令操作&#xff0c;内容不是特别的全&#xff0c;找的几个典型的常用的演示&#xff0c;想要全面的可以另找资料了解一下&#xff0c;推荐大家跟着敲跟着做才能加深记忆&#xff0c;祝大家学的开心…

Linux —— 文件操作

目录 1.内核提供的文件系统调用 1.1open和close 1.2标记位 1.3write和read 2.文件描述 2.1文件描述符 2.2文件描述符分配规则 3.重定向 3.1最“挫”的重定向 3.2使用系统调用 3.3重定向原理 3.4让我们的"shell"支持重定向操作 4.一切皆文件 5.缓冲区 5…

文件操作详解

1.文件的概念 文件的基本概念   所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称&#xff0c;叫做文件名。实际上在前面的各章中我们已经多次使用了文件&#xff0c;例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁…

文件操作(C语言)

目录 一、前言 二、文件的打开和关闭 三、文件的读写 1.文件的顺序读写 2.文件的随机读写 四、文件结束的判定 一、前言 当我们向写好的通讯录程序中输入信息时&#xff0c;有时我们希望能保存输入的信息&#xff0c;不用每次打开这个程序都要重新输入&#xff0c;这时就…

文件操作详解(超级详细)

正常我们的程序在执行的时候程序结束后&#xff0c;会将所有数据清楚&#xff0c;那么我们应该如何保存数据呢&#xff1f;这里我们就需要用文件操作。 一、文件的打开和关闭 1.文件打开、关闭函数—fopen、fclose //打开文件 FILE * pf fopen ( const char * filename, const…

虚拟机安装黑苹果【虚拟机安装,黑苹果安装,黑苹果无法全屏问题】(这应该全网最全的资源了吧~)

一&#xff0c;资源下载 链接&#xff1a;https://pan.baidu.com/s/1cyGiDvkJinx8dnB57gO7UQ 提取码&#xff1a;i615 PS&#xff1a;里面有虚拟机资源&#xff0c;Drawin.ios文件和苹果镜像文件 这里只讲如何用虚拟机安装黑苹果&#xff0c;不讲如何安装虚拟机&#xff0c;下…

VMware虚拟机安装黑苹果10.15 || AMD R7 5800处理器

VMwar版本&#xff1a;16Pro 链接&#xff1a;https://pan.baidu.com/s/1qGHEynWSV4YS9WSNonxiuA?pwdazvh 提取码&#xff1a;azvh macOS链接&#xff0c;版本为Catalina 10.5。这个版本后&#xff0c;os安装包就过10G了&#xff0c;会特别卡。 链接&#xff1a;https://pan…

VMware16安装macOS10.15.1 - 黑苹果 - osx虚拟机

效果图 步骤 下载安装VMware&#xff0c;并且利用unlocker开启macos的支持VMware利用unlocker开启MacOS支持_Rudon滨海渔村的博客-CSDN博客效果步骤下载安装vmware16http://www.winwin7.com/soft/17946.html下载unlocker3.0 &#xff08;这里包括了darwin.iso和darwinPre15.is…

vm虚拟机15.5安装黑苹果maxos-10.14

鼎峰_小配针对vm虚拟机安装黑苹果maxos在学习和研究探索的过程中的一点点心得&#xff0c;从刚接触时的一脸懵逼&#xff0c;到后来慢慢的了解了&#xff0c;废话不多说&#xff0c;直接上干货。 一、需要准备的软件&#xff1a; a)解锁虚拟机MAC补丁&#xff1a;Unlocker 3.0…