[C语言]文件操作

news2024/9/23 13:27:05

目录

1.文件

1.1程序文件

1.2数据文件

2.文件名

3.文件的打开和关闭

3.1文件指针

3.2文件的打开和关闭

4.文件的顺序读写

4.1fgetc

 4.2fputc

 4.3fgets

4.4fputs

4.5fscanf

4.6fprintf

4.7fread(二进制输出)

4.8fwriite(二进制输入)

5.文件的随机读写

5.1fseek

 5.2ftell

5.3rewind

6.文件读取结束的判断


 

1.文件

1.1程序文件

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

1.2数据文件

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

2.文件名

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

        例如:c:\code\test.txt

3.文件的打开和关闭

3.1文件指针

        文件指针,指的是文件类型指针,为指针的一种。当文件被使用的时候会在内存中开辟一个相应的文件信息区,用来存放文件相关信息。这些信息保存在一个结构体变量中,该结构体类型是有系统声明的,取名为FILE。

        创建一个文件指针变量:

FILE* pf;

        以上定义了pf为指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区。通过文件信息区的信息就能够访问文件,也就是通过文件指针变量能够找到与其相关联的文件。

3.2文件的打开和关闭

         在对文件进行操作前应先打开文件,在使用结束后应关闭相应的文件。

        我们通过fopen和fclose函数来对文件进行打开与关闭:

        文件的打开

FILE *fopen(const char *filename, const char *mode)//打开文件

        filename是要打开的文件的文件名,mode为文件的打开方式。文件的打开方式如下 

文件使用方式含义如果指定文件不存在
r为了输入数据,打开一个已经存在的文本文件出错
w为了输出数据,打开一个文本文件建立一个新文件
a向文本文件尾添加数据建立一个新文件
rb为了输入数据,打开一个二进制文件出错
wb为了输出数据,打开一个二进制文件建立一个新文件
ab向二进制文件尾添加数据出错
r+为了读和写,打开一个文本文件出错
w+为了读和写,建立一个新的文件建立一个新文件
a+打开一个文件,在文件尾进行读写建立一个新文件
rb+为了读和写打开一个二进制文件出错
wb+为了读和写,新建一个新的二进制文件建立一个新文件
ab+打开一个二进制文件,在文件尾进行读和写

建立一个新文件 

        文件的关闭

int fclose(FILE *stream)

4.文件的顺序读写

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

4.1fgetc

int fgetc(FILE *stream);

        fgetc函数从指定的流从获取下一个无符号字符,并把光标移动到下一位。此函数的返回值为int整型,返回相应字符的ASCII值。

        会按照顺序获取字符,如果文件中的信息为‘abcd’,第一次fgetc为‘a’,第二次使用则为‘b’,以此类推。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
	}
	int ch = fgetc(pf);
	printf("%c\n", ch);
	printf("%d", ch);

	fclose(pf);
	return 0;
}

 4.2fputc

int fputc(int char, FILE *stream) ;

        fputc函数把指定的char参数写入到指定的流中,并把光标向前移动一位。

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
	}
	fputc('a', pf);
	for (char i = 'b'; i <= 'e'; i++)
	{
		fputc(i, pf);
	}

	fclose(pf);
	return 0;
}

         值得注意的是,再下一次重新使用fputc的时候会将第一次已经输入好的数据进行覆盖。

fputc('a', pf);
	for (char i = 'o'; i <= 'q'; i++)
	{
		fputc(i, pf);
	}

        再次查看文本,得到的是:

 4.3fgets

char *fgets(char *str, int n, FILE *stream)

        当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

         当你想要读取a个字符的时候,参数n应填上a+1。因为要给\0留上一个空位

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
	}
	char str[10] = { 0 };
	fgets(str, 6, pf);
	printf("%s", str);

	fclose(pf);
	return 0;
}

4.4fputs

int fputs(const char *str, FILE *stream)

        写入指定的字符串到指定的流中,并把位置标识符往前移。

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
	}
	fputs("happy chinese new year\n", pf);
	fputs("恭喜发财", pf);

	fclose(pf);
	return 0;
}

4.5fscanf

int fscanf(FILE *stream, const char *format, ...)

        从流 stream 读取格式化输入.

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
	}
	int a = 0;
	char ch = 0;
	char name[10] = {0};
	fscanf(pf, "%d %c %s", &a, &ch, name);
	printf("%d %c %s\n", a, ch, name);

	fclose(pf);
	return 0;
}

         

 

4.6fprintf

        发送格式化输出到流 stream 中,和printf差不多,按照printf的格式写完后,在前面加上指定的文件指针即可。

int fprintf(FILE *stream, const char *format, ...)

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
	}
	int a = 1;
	char ch = 'z';
	char name[] = "zhangsan";
	fprintf(pf, "%d %c %s", a, ch, name);

	fclose(pf);
	return 0;
}

4.7fread(二进制输出)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

      从给定流 stream 读取数据到 ptr 所指向的数组中

int main()
{
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
	}
	char str[20] = {0};
	fread(str, sizeof(str), 1, pf);
	printf("%s", str);

	fclose(pf);
	return 0;
}

 

 

4.8fwriite(二进制输入)

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

         以二进制的形式对文件进行操作,把 ptr 所指向的数组中的数据写入到给定流 stream 中

int main()
{
	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
	}
	char str[20] = "hello";
	fwrite(str, sizeof(str), 1, pf);

	fclose(pf);
	return 0;
}

5.文件的随机读写

5.1fseek

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

        whence表示开始添加偏移 offset 的位置,有以下几种常量。

        fseek函数起到的作用为,改变光标的位置,对下一步的操作进行处理。

SEEK_SET文件的开头
SEEK_CUR文件指针的当前位置
SEEK_END文件的末尾

         此时文本当中的信息为:abcdef

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
	}
	char ch;
	ch = fgetc(pf);
	printf("%c", ch);
	ch = fgetc(pf);
	printf("%c", ch);

	fseek(pf, 0, SEEK_SET);//从初始位置开始,不偏移
	ch = fgetc(pf);
	printf("%c", ch);

	fseek(pf, -2, SEEK_END);//从末尾位置开始,向左偏移两位
	ch = fgetc(pf);
	printf("%c", ch);

	fclose(pf);
	return 0;
}

 5.2ftell

long int ftell(FILE *stream)

        返回相对于起始位置的偏移量,就是目前光标所在的位置

        文件中的信息为:abcdef

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
	}
	char ch;
	ch = fgetc(pf);
	printf("%c", ch);
	ch = fgetc(pf);
	printf("%c", ch);

	fseek(pf, 0, SEEK_SET);//从初始位置开始,不偏移
	ch = fgetc(pf);
	printf("%c", ch);

	fseek(pf, -2, SEEK_END);//从末尾位置开始,向左偏移两位
	ch = fgetc(pf);
	printf("%c", ch);
	printf("%d", ftell(pf));//光标目前的位置

	fclose(pf);
	return 0;
}

         最后获取的字符为e,位于向左偏移5位处。

5.3rewind

void rewind(FILE *stream)

        让光标回到文件的初始位置

rewind(pf);
pf为文件指针

6.文件读取结束的判断

        1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
                fgetc 判断是否为 EOF .
                fgets 判断返回值是否为 NULL .
        2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
                fread判断返回值是否小于实际要读的个数。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python【xpath】实战案例【中】

获取全国地级城市名称&#xff1a;案例准备&#xff1a;导入外部库 1.requests、2.lxml容易遇到的问题&#xff1a;网站SSL认证失效代码块&#xff1a;#导入第三方库 import requests from lxml import etree # 网页地址 url https://www.aqistudy.cn/historydata/ #U-A伪装 h…

SOFA Weekly|SOFANews、issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

论文投稿指南——中文核心期刊推荐(公路运输)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Linux嵌入式开发——用户与用户组

文章目录Linux嵌入式开发——用户与用户组用户用户组创建用户和用户组1、图形化界面创建2、命令创建添加用户用户查询修改用户密码删除用户添加用户组显示组内用户名删除用户组Linux嵌入式开发——用户与用户组 用户 Linux是一个多用户操作系统&#xff0c;不同的用户拥有不同…

过年回家,你是否也像我一样努力生动的给别人解释软件开发是干啥滴?

这个年就这样&#xff0c;在喜气洋洋的气氛中&#xff0c;在我们依依不舍的留恋中&#xff0c;从我们身边溜走了。这次回家又碰见了亲戚们不厌其烦的问我&#xff0c;你做什么工作呐&#xff1f;于是就有了我以下生动的解释 目录 打字的 帮助传话&#xff0c;帮助卖东西 皮…

亚马逊云科技:强强联合助力中国头部车企打造优质服务体验

2023年1月9日在美国拉斯维加斯刚落幕的国际消费电子展&#xff08;CES 2023&#xff09;上&#xff0c;亚马逊云科技的2位重要合作伙伴BlackBerry和中国领先的车联网&#xff08;IoV&#xff09;技术服务与产品提供商博泰车联网共同宣布&#xff0c;由BlackBerry IVY™赋能的博…

.Net 7 托管Main入口的四种写法(茴香豆?)

前言&#xff1a; 按照CLR的规则,C#托管Main入口其实有四种写法。 写法 第一种&#xff1a;最常见的&#xff0c;也是VS默认的&#xff0c;返回值void,带一个参数 static void Main(string[] args) {Console.Write("Tian xia feng yun chu wo bei");Console.ReadLine…

python图像处理(均值滤波)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在图像处理过程中,一个绕不开的话题就是噪声。其中比较经典的就是椒盐噪声。为了降低这些噪声对最终图像处理效果的影响,人们想了很多的方法,比如说均值滤波、中值滤波、高斯滤波…

java多线程-线程属性

线程属性 线程各属性 线程ID id从 1 开始计数&#xff0c;因为在源码中是如下实现的&#xff0c;初始值设置为0&#xff0c;id是先自增再返回 private volatile int threadStatus 0;private static synchronized long nextThreadID() {return threadSeqNumber; }现在来演示…

处理比赛数据记录

文章目录一、需求二、爬取阶段1.使用requests进行请求获取网页内容2.使用selenium模拟人操作浏览器获取网页内容(1)环境配置(2) 源码3.使用phantomjs模拟人操作浏览器获取网页内容浅浅记录一下自己在做一个比赛数据处理过程中的遇到的一些问题。一、需求 首先数据的格式是长下…

AcWing 1064. 小国王(状态压缩DP)

AcWing 1064. 小国王一、问题二、思路1、整体逻辑2、状态表示3、状态转移4、循环设计5、初末状态三、代码一、问题 二、思路 1、整体逻辑 我们看下面这个例子&#xff1a; 如果我们一行一行放的话。 在上图中&#xff0c;我们先看第二行&#xff0c;我们发现第二行在哪个位…

NR R16 上行满功率传输(ULFPTx)

微信公众号同步更新&#xff0c;欢迎关注同名“modem协议笔记” UL full power Tx(ULFPTx Mode)&#xff0c;上行满功率传输&#xff0c;是R16版本的一个增强&#xff0c;R15由于受限于codebook和PUSCH功率控制&#xff0c;某些情况下无法达到满功率传输&#xff08;例如26dBm…

论文投稿指南——中文核心期刊推荐(建筑科学 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

齐晖医药冲刺上市:毛利率持续下滑,刘祥宜和朱建民夫妇为实控人

近日&#xff0c;江苏齐晖医药科技股份有限公司&#xff08;下称“齐晖医药”&#xff09;递交预披露招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;齐晖医药计划募资6.97亿元&#xff0c;将用于动保原料药生产基地项目、研发中心建设项目&#xf…

“编辑距离”系列总结,一文读懂(Java实现)

目录 一、判断子序列 ——>删除元素 1.1、dp定义 1.2、递推公式 1.3、初始化 1.4、遍历顺序 1.5、解题代码 二、不同的子序列 ——>删除元素 2.1、dp定义 2.2、递推公式 2.3、初始化 2.4、遍历顺序 2.5、解题代码 三、两个字符串的删除操作 ——>删除元素…

设计模式 - 六大设计原则之DIP(依赖倒置原则)

文章目录概述CaseBad ImplBetter Impl概述 设计代码架构时&#xff0c;高层模块不应该依赖于底层模块&#xff0c;二者都应该依赖于抽象。 抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象。 依赖倒置原则是实现开闭原则的重要途径之一&#xff0c; 它降低了类之间的耦合…

代码随想录算法训练营第十天 | 理论基础,232.用栈实现队列,225. 用队列实现栈

一、参考资料理论基础文章讲解&#xff1a;https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 用栈实现队列题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E…

【Linux】多线程详解(上)

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

百度2015年系统工程师笔试题:判断当前机器的大小端

本篇文章主要讲解大小端的判断问题&#xff0c;需要拥有指针&#xff0c;位段&#xff0c;联合体的知识。 目录 一.题目呈现 二.三种解题方法 1.巧妙利用指针和强制转换 2.利用位段的特性 3.利用联合体的性质 一.题目呈现 请简述大端字节序和小端字节序的概念&#xff0c;…

剑指 Offer 03. 无重复字符的最长子串 [C语言]

目录题目思路1代码1结果1思路2代码2结果2该文章只是用于记录考研复试刷题题目 Leetcode 03: 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所…