c语言中文件操作

这篇具有很好参考价值的文章主要介绍了c语言中文件操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们为了让写的程序储存在电脑中,就可以使用文件。这样就不会随着程序退出,内存回收造成数据丢失了。


一、文件

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失
了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤
⽂件。

1.1什么是文件

磁盘(硬盘)上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件数据⽂件(从⽂件功能的⻆度来分类
的)。

1.2程序文件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。

1.3数据文件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到显⽰器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。

1.4文件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt
为了⽅便起⻅,⽂件标识常被称为⽂件名。

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

根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂
本⽂件。
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽
⼆进制形式输出,则在磁盘上只占4个字节(VS2019测试)。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

int main()
{
	int a = 10000;
	FILE* pa = fopen("text.txt", "wb");
	if (pa = NULL)
	{
		perror("fopen");
		return 1;
	}
	fwrite(&a, 4, 1, pa);//以二进制都形式写到文件中
	fclose(pa);
	pa = NULL;
	return 0;
}

三、文件的打开和关闭

3.1流和标准流

3.1.1流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

3.1.2标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语⾔程序在启动的时候,默认打开了3个流:

  1. stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
  2. stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出流中。
  3. stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
stdin、stdout、stderr 三个流的类型是:FILE*,通常称为文件指针
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

3.2文件指针

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

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

例如,VS2013 编译环境提供的 stdio.h 头⽂件中有以下的⽂件类型申明:

struct _iobuf {
 	char *_ptr;
 	int _cnt;
 	char *_base;
 	int _flag;
 	int _file;
 	int _charbuf;
 	int _bufsiz;
 	char *_tmpfname;
};
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节。
⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加⽅便。

FILE* pa;

定义pa是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

3.3文件的打开和关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。

在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。


//打开文件
FILE*  fopen(const char* filename, const char* mode);
//关闭文件
int fclose(FILE* stream);

mode表示文件的打开模式,下面都是文件的打开方式。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

四、文件的顺序读写

4.1 fgetc

fgetc 的功能是字符输入函数,适用于所有输入流。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.2 fputc

fputc 的功能是字符输出函数,适用于所有输出流。

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.3 fgets

fgets 的功能是字符输入函数,适用于所有输入流。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.4 fputs

fputs 的功能是字符输出函数,适用于所有输出流。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.5 fscanf

fscanf的功能是格式化输入函数,适用于所有的输入流。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.6 fprintf

fprintf 的功能是格式化输出函数,适用于所有的输出流。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.7 fread

fread的功能是二进制输入,适用于文件输入流。

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.8 fwrite

fwrite的功能是二进制输出,适用于文件输出流。

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

4.9 对比一组函数

scanf、fscanf、sscanf、
printf、fprintf、sprintf、

scanf和printf我们很熟悉,scanf是从标准输入流上读取格式化的数据,printf是把数据以格式化的形式打印在标准输出流上。
fscanf和fprintf的实现形式在上面写过。fscanf是从指定的输入流上读取格式化的数据。fprintf是把数据以格式化的形式打印在指定的输出流上。

4.9.1 sscanf和sprintf

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

五、文件的随机读写

5.1 fseek

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

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。
c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法
要注意,在这个函数的参数中有是三个常量。

  1. SEEK_SET是文件指针的起始位置。
  2. SEEK_CUR是文件指针的当前位置。
  3. SEEK_END文件指针处于末尾位置。

5.2 ftell

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

long int ftell ( FILE * stream );

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法
ftell函数表示的是文件指针所处位置先对于文件指针起始位置的偏移量。

5.3 rewind

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

 void rewind ( FILE * stream );

c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法
这个代码,在用rewind函数之前文件指针在f的位置,偏移量为6。通过用rewind函数返回了文件的起始位置,偏移量变为0。

六、文件读取结束的判定

6.1 被错误使用的feof

牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。
feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

  1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    fgetc 判断是否为 EOF .
    fgets 判断返回值是否为 NULL

  2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
    例如:
    fread判断返回值是否⼩于实际要读的个数。
    c语言中文件操作,c语言,c语言,开发语言,数据结构,c++,算法

七、文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。文章来源地址https://www.toymoban.com/news/detail-845866.html

到了这里,关于c语言中文件操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——排序算法(C语言)

    本篇将详细讲一下以下排序算法: 直接插入排序 希尔排序 选择排序 快速排序 归并排序 计数排序 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某写的大小,按照递增或递减0排列起来的操作。 稳定性的概念 假定在待排序的记录序列中,存在多个

    2024年02月08日
    浏览(66)
  • C语言数据结构与算法

    冒泡排序 例题 顺序表下的 冒泡排序 注意:冒泡排序 稳定,最多执行n(n-1)/2次 选择排序不稳定,平均比较次数n(n-1)/2 直接插入排序,是在有序基础上,速度最快且稳定的排序方法。 希尔排序是 不稳定的 顺序查找 二分查找(非递归) 二分查找(递归) 数组 链表 查询 快 慢

    2024年02月06日
    浏览(74)
  • 数据结构和算法——用C语言实现所有图状结构及相关算法

    本文所有代码均在仓库中,这是一个完整的由纯C语言实现的可以存储任意类型元素的数据结构的工程项目。 首先是极好的工程意识,该项目是一个中大型的CMake项目,结构目录清晰,通过这个项目可以遇见许多工程问题并且可以培养自己的工程意识。 其次是优秀的封装性(

    2024年02月06日
    浏览(222)
  • 【数据结构】链栈的基本操作(C语言)

    零零总总搜索了一些关于链栈的资料,了解了链栈的基本操作,一直觉得别人写的代码或多或少存在一些问题,所以打算自己写一篇关于链栈的文章,也算是对所学知识的梳理和巩固了。 首先说明本文使用C语言进行链栈的基本操作,链栈是无头结点的。这里补充说明一下,

    2024年02月05日
    浏览(59)
  • 【数据结构】队列基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(51)
  • C语言 数据结构--栈 括号匹配算法

    今天这一期使用栈来完成括号匹配算法 ① 栈结构 ② 初始化栈 ③ 入栈 ④ 出栈 ⑤ 判断栈是否为空 ⑤ 括号匹配 完整代码: 结果: (1)括号序列为char str[]={\\\'(\\\',\\\'{\\\',\\\'[\\\',\\\']\\\',\\\'}\\\',\\\')\\\'}; (2)括号序列为char str1[]={\\\'{\\\',\\\'(\\\',\\\'}\\\',\\\']\\\'};    

    2024年02月05日
    浏览(54)
  • C语言 数据结构与算法 I

    因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。 首先是环境,学C++时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大 直接运行一手 嗯。。JB家的新UI。。真是。。。。。。。一

    2024年02月09日
    浏览(42)
  • 数据结构与算法——排序(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(59)
  • 【数据结构】顺序表基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(56)
  • 【数据结构】 链栈的基本操作 (C语言版)

    目录 一、链栈 1、链栈的定义: 2、链栈的优缺点: 二、链栈的基本操作算法(C语言)     1、宏定义   2、创建结构体 3、链栈的初始化   4、链栈的进栈 5、链栈的出栈 6、获取栈顶元素 7、栈的遍历输出 8、链栈的判空  9、求链栈的栈长 10、链栈的清空 11、链栈的销毁

    2024年01月24日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包