C语言——文件操作(2)文件的读写操作

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

        之前,我讲解了文件的基本情况与读写模式,看到这篇博客的小伙伴们先参考这篇博客:

 C语言——文件操作详解(1)_

        接下来,我会继续讲解文件操作的第二大步:文件读/写操作。

目录

        A.文件的顺序读写

        一.字符输入输出函数 

        1.fputc字符输出函数

        2.代码实践:

         3.字符输入函数 fgetc

        4.代码实践:

       二.字符串输入输出函数

        1.文本行输出函数 fputs—— 将一个字符串写入流中

        2.代码实践:

        3.文本行输入函数 fgets——从流中读取一个字符串 

        4.代码实践: 

        5.文件打开模式:"a"写文件(追加)

       三.格式化输入输出函数

        1.格式化输出函数 fprintf

         2.代码实践:

        3.格式化输入函数 fscanf ——从文件中读取格式化数据

        4.代码实践:

      四.二进制输入输出函数 

         1.二进制输出 fwrite——将数据块写入流中

         2.代码实践:

         3.二进制输入 fread——从流中读取数据

         4.代码实践:

    五.sscanf函数与sprintf函数

        sprintf 

        2.代码实践:

    六.printf与scanf同类型函数对比

    七.流 


A.文件的顺序读写

首先,先来看几个常用的读写函数:

C语言——文件操作(2)文件的读写操作

一.字符输入输出函数 

1.fputc字符输出函数

int fputc ( int character, FILE * stream );

参数介绍:

        int character:表示填写要输入文件的字符

        FILE * stream(流):指向标识输出流的 FILE 对象的指针。

成功后,将返回写入的字符,并且文件指针指向下一个位置等待写入。
如果发生写入错误,则返回 EOF 并设置错误指示器(ferror)。

2.代码实践:

int main() {
	FILE* pf = fopen("test.txt", "w");

    //判断文件是否正常打开
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}

	//字符输入函数——fputc()
	char ch = 0;
	fputc('a', pf);
	fputc(';', pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

        注:每次使用fputc函数都只能往文件中输入一个字符 。

通过代码调试后,打开test.txt文件,里面会显示刚才输入的两个字符,如下:

C语言——文件操作(2)文件的读写操作

#include><stdio.h>
int main() {
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}

	//字符输入函数——fputc()——一次写入一个字符
	char ch = 0;
	fputc('a', pf);//往test.txt文件中输入一个字符
	fputc(';', pf);//往文件中输入一个;号字符

	
	for (ch = 'b'; ch <= 'z'; ch++) {
		fputc(ch, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

         代码讲解:因为fputc每使用一次才能往文件中输入一个字符,使用循环可以实现多次输入,如上代码,我循环了25次,输入了b~z 25个字符,经代码调试后,如下:

C语言——文件操作(2)文件的读写操作


 3.字符输入函数 fgetc

C语言——文件操作(2)文件的读写操作

 参数只有一个,就是文件指针,意为从文件中读取一个字符内容。返回值为整型

4.代码实践:

int main() {
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}
	//字符输出函数——fgetc(),一次读取一个字符
	char ch = 0;

	ch=fgetc(pf);//往test.txt文件中读取一个字符
	printf("%c\n", ch);

	ch = fgetc(pf);//往文件中读取第二个字符
	printf("%c\n", ch);

	ch = fgetc(pf);//往文件中读取第三个字符
	printf("%c\n", ch);

	ch = fgetc(pf);//往文件中读取第四个字符
	printf("%c\n", ch);


	fclose(pf);
	pf = NULL;
	return 0;
}

如上图代码,fgetc每使用一次,也就能读取一个字符。

C语言——文件操作(2)文件的读写操作

        还是使用循环法可以读取文件中的所有内容!如下:

#include<stdio.h>
//读文件——"r"
int main() {
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}
	//字符输出函数——fgetc(),一次读取一个字符
	char ch = 0;

	//使用循环方式读取文件字符,一次读一个
	while ((ch = fgetc(pf)) != EOF) {
		printf("%c ", ch);//可以读取到文件中所有字符
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

 二.字符串输入输出函数

1.文本行输出函数 fputs—— 将一个字符串写入流中(写入后不会自动换行,需要自己加'\n')

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


函数参数:
str:                          包含要写入的内容的字符串

stream(流):        指向标识输出流的 FILE 对象的指针。

函数作用:

将 str 所指向的 C 字符串写入
该函数开始从指定的地址 (str) 复制,直到到达终止空字符 ('\0')。此终止空字符不会复制到流中。

 2.代码实践:

//写一个字符串到文件中

 //使用函数fputs_一次写入一个字符串的数据
int main() {
		FILE* pf = fopen("test.txt", "w");
		if (pf == NULL) {
			printf("%s\n", strerror(errno));
			return 1;
		}

		char ch = 0;
		fputs("abcd", pf);
		fputs("efghi\n", pf);
		fputs("jklmn\n", pf);

	
		//关闭文件
		fclose(pf);
		pf = NULL;
		return 0;
	}

        代码讲解:第一次执行的fputs函数,它不会换行,需要手动添加\n标志,否则会一直在第一行进行文件的输入填写。代码调试后结果如下:

C语言——文件操作(2)文件的读写操作

        注1:第一次使用的fputs函数,字符串"abcd"没有加'\n',所以在第二次输入的字符串会紧挨第一个字符串的末尾位置。

        注2: 每次对test.txt文件进行调试运行时,都会覆盖掉上一次的数据内容。

        例:上一次test.txt中保存的数据是 a;bcdef~z共27个字符,现在换成了abcdefghi (换行) jklmn等内容。

3.文本行输入函数 fgets——从流中读取一个字符串 

char * fgets ( char * str, int num, FILE * stream );

str:                   指向在其中复制字符串读取的 chars 数组的指针。

num:                要复制到 str 中的最大字符数(包括终止空字符)。

stream(流):      指向标识输入流的 FILE 对象的指针。

函数作用:

中读取字符并将其作为 C 字符串存储到 str 中,直到读取 (num-1) 字符或达到换行符或文件末尾(以先发生者为准)。
换行符使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。
终止空字符会自动追加到复制到 str 的字符之后。

4.代码实践: 

#include<stdio.h>
 int main() {

	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}
	
	char arr[300];


	fgets(arr,5,pf);
	printf("%s\n", arr);

	fgets(arr, 6, pf);
	printf("%s\n", arr);

	fgets(arr, 6, pf);
	printf("%s\n", arr);
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

调试结果: 

C语言——文件操作(2)文件的读写操作       

代码讲解:

       1. 打开test.txt文件,在第一个fgets函数中,表示从文件指针读取5个字符到char arr数组中去。但从结果上看,只读取到abcd4个字符。

        原因:fgets功能是读取一个字符串,函数在按要求读取时,最后一个读到的字符一定为'\0'结束字符,所以输出abcd。如下图:

C语言——文件操作(2)文件的读写操作

2. 当第一个pgets函数读取完字符串后,文件指针默认跳转到文件的下一个内容中,所以第二个fgets函数读取到的字符串紧随其后,输出字符串"efghi"。

3.为什么第三个fgets函数什么也没有输出?原因:字符串"jklmn"处于第二行,fgets在第二次的使用中遇到'\0',换行符使 fgets 停止读取,无论在怎么使用fgets函数也没法读到。所以什么也不输出。

若想读到第二行,还是利用循环法读取文件所有内容。

int main() {

	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 1;
	}
	//字符输出函数——fgets()——一次读取一行字符
	char arr[300];

	while (fgets(arr, 300, pf) != NULL) {
		printf("%s\n", arr);
	}
	
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

C语言——文件操作(2)文件的读写操作


此外,再说一说文件打开模式:"a"追加

5.文件打开模式:"a"写文件(追加)

int main() {
	FILE* pf = fopen("test.txt", "a");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return -1;
	}
	fputs("hello bit!", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

结果如下:

C语言——文件操作(2)文件的读写操作


 三.格式化输入输出函数

1.格式化输出函数 fprintf

C语言——文件操作(2)文件的读写操作

函数参数:

stream:        指向标识输出流的 FILE 对象的指针

format:         各类型的输出形式,以%开头的,如%f,%s,%c,%d等

 2.代码实践:

struct S {
	char arr[10];
	int age;
	double score;
};

int main() {
	struct S s = { "zhangsan",20,95.56 };
	FILE* pf = fopen("test2.txt", "w");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return -1;
	}

	
	//printf("%s %d %lf\n", s.arr, s.age, s.score);
	fprintf(pf, "%s %d %lf\n", s.arr, s.age, s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码讲解fprintf的作用:把结构体变量s中的信息写入到文件test2.txt中.

                而printf与fprintf的区别在于:fprintf比printf只多了一个参数——文件指针。

结果如下:

C语言——文件操作(2)文件的读写操作

3.格式化输入函数 fscanf ——从文件中读取格式化数据

C语言——文件操作(2)文件的读写操作

函数参数同上; 

4.代码实践:

struct S {
	char arr[10];
	int age;
	double score;
};
int main() {
	struct S s;
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return -1;
	}

	//scanf("%s %d %lf",      s.arr, &(s.age), &(s.score));
	  fscanf(pf, "%s %d %lf", s.arr, &(s.age), &(s.score));

	  printf("%s %d %lf\n", s.arr, s.age, s.score);//将读取到的显示出来

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码讲解: fscanf(pf, "%s %d %lf", s.arr, &(s.age), &(s.score));//从文件中读取出结构体数据。

                   fscanf比scanf也是只多一个文件指针参数。

C语言——文件操作(2)文件的读写操作


 四.二进制输入输出函数 

1.二进制输出 fwrite——将数据块写入流中

C语言——文件操作(2)文件的读写操作

函数参数:

ptr:     指向要写入的元素数组的指针,转换为 const void*。

size:   要写入的每个元素的大小(以字节为单位)。

count:元素数,每个元素的大小为字节大小

stream: 指向指定输出流的 FILE 对象的指针。

 2.代码实践:

struct S2 {
	char arr[20];
	int age;
	double score;
	};
int main() {
	struct S2 s = { "张三",25,93.25 };//创建结构体变量信息
	FILE* pf = fopen("test2.txt", "wb");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return -1;
	}
	fwrite(&s, sizeof(struct S2), 1, pf);//将结构体变量中的信息写入文件中除了张三,
										 //其他都是乱码
										//张三以文本形式写进去,以二进制形式写出来是
										//一样的

	fclose(pf);
	pf = NULL;
	return 0;
}

 调试结果:

C语言——文件操作(2)文件的读写操作

   注:有乱码是因为,数据内容是以二进制形式写入文件,有的东西文件无法失败,出现乱码。 

3.二进制输入 fread——从流中读取数据

 C语言——文件操作(2)文件的读写操作

 4.代码实践:

struct S2 {
	char arr[20];
	int age;
	double score;
};
int main() {
	struct S2 s;
	FILE* pf = fopen("test2.txt", "rb");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return -1;
	}
	fread(&s, sizeof(struct S2), 1, pf);//从文件中读取内容
	printf("%s %d %lf\n", s.arr, s.age, s.score);

	fclose(pf);
	pf = NULL;
	return 0;
}

C语言——文件操作(2)文件的读写操作


五.sscanf函数与sprintf函数

C语言——文件操作(2)文件的读写操作

sprintf 

C语言——文件操作(2)文件的读写操作

2.代码实践:

struct S3 {
	char arr[10];
	int age;
	double score;
};
int main() {
	struct S3 s = { "张三",25,56.30 };
	char a[100] = { 0 };

	sprintf(a, "%s %d %lf\n", s.arr, s.age, s.score);
	printf("字符串输出:%s\n", a);//数组a中的内容:"张三 25 56.300000"(字符串)

	struct S3 tmp = { 0 };

	sscanf(a, "%s %d %lf", tmp.arr, &(tmp.age), &(tmp.score));
	printf("格式化输出:%s %d %lf\n", tmp.arr, tmp.age, tmp.score);
	return 0;
}

代码讲解://sprintf是将格式化数据转换成字符串放入数组a中

                //sscanf是将数组a中字符串的内容取出,放入为格式化数据中 

C语言——文件操作(2)文件的读写操作

 


六.printf与scanf同类型函数对比

任何一个C程序,只要运行起来,会默认打开三个流:
stdin              标准输入流(键盘)——scanf
stdout           标准输出流(屏幕)——printf
stderror        标准错误流(屏幕)

 scanf是针对标准输入的格式化输入语句;              prinf是针对标准输出的格式化输出语句

 fscanf是针对所有输入流的格式化输入语句;         fprintf 是针对所有输出流的格式化输出语句.

 sscanf从一个字符串中转化处一个格式化的数据;sprintf是把一个格式化的数据转化成字符串


七.流 

1.刚才很多函数都提到了流这个词,流就是文件指针,下图就是流的作用图解:

C语言——文件操作(2)文件的读写操作

        2.打开一个流,将把该流与一个文件或设备连接起来,关闭流将断开这种连接,打开一个文件将返回一个指向FILE结构体类型的指针,该指针记录了控制该流的所有必要信息。       

        3.拿输入来说,stdin就是默认的输入流,通常就是键盘输入。啥意思?就是没有特别说明的话,你的程序就是找键盘要那个需要被复制的文件。stdin就是一个指向键盘这个输入设备的指针。针对这个stdin这个指针,又有对应的函数来执行相印的操作,如果输入的是字符,就用getchar,若是文本则用gets,scanf,二进制数据用fread。 理解了这一个流,其他也是如出一辙。


好了,关于文件操作的读写函数就介绍到这,大家觉得有用的话点个一键三连吧,下期见!文章来源地址https://www.toymoban.com/news/detail-486844.html

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

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

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

相关文章

  • 【c语言】二进制文件的读写操作

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c语言系列专栏:c语言之路重点知识整合 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 本文基

    2024年02月12日
    浏览(43)
  • 【头歌】——数据分析与实践-基于Python语言的文件与文件夹管理-文本 文件处理-利用csv模块进行csv文件的读写操作

    第1关 创建子文件夹 第2关 删除带有只读属性的文件 第3关 批量复制文件夹中的所有文件 未通过本题,如果您通过了本题欢迎补充到评论区,有时间我会整理进来 第1关 读取宋词文件,根据词人建立多个文件 第2关 读取宋词文件,并根据词人建立多个文件夹 第3关 读取宋词文

    2024年01月25日
    浏览(68)
  • 大模型的数据隐私问题有解了,浙江大学提出联邦大语言模型

    作者 | 小戏、Python 理想化的 Learning 的理论方法作用于现实世界总会面临着诸多挑战,从模型部署到模型压缩,从数据的可获取性到数据的隐私问题。 而面对着公共领域数据的稀缺性以及私有领域的数据隐私问题,联邦学习(Federated Learning)作为一种分布式的机器学习框架吸

    2024年02月13日
    浏览(33)
  • c++文件操作 (1) -- 读写文件

    目录 为什么使用文件操作 文件输入流和输出流 -- 相对于内存而言 文件操作  1. 文件操作常用类以及头文件 2. 文件输入流(写文件操作)  1. 写文本文件  1)文件操作是使用对象来实现的  2)文件输出  3)打开文件  open函数 : 2. 读文本文件  3. 写二进制文件   4. 读二进制

    2024年01月25日
    浏览(44)
  • Qt文件系统操作和文件的读写

    QIODevice:所有输入输出设备的基础类 QFile :用于文件操作和文件数据读写的类 QSaveFile :用于安全保存文件的类 QTemporaryFile :用于创建临时文件的类 QTcpSocket 和 QUdpSocket :分别实现了TCP和UDP的类 QSerialPort :实现串口通信的类 QBluetoothSocket :用于蓝牙通信的类 QProcess :用于启

    2024年02月12日
    浏览(48)
  • C#文件读写操作 [详细]

    文件是存储在磁盘中的具有特定名称和目录路径的数据集合,当我们使用程序对文件进行读取或写入时,程序会将文件以数据流(简称流)的形式读入内存中。我们可以将流看作是通过通信路径传递的字节序列,流主要分为输入流和输出流,输入流主要用于从文件读取数据(

    2024年01月16日
    浏览(37)
  • Qt——文件的读写操作

    文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处理而开发的,所以文件读写是应用程序开发的一个基本功能。 Qt 提供了两种读写纯文本文件的基本方法: 用 QFile 类 的 IODevice 读写功能直接进行读写 利用 QFile 和 QTextStream 结合起来,

    2024年02月13日
    浏览(45)
  • 「Qt」文件读写操作

            我们知道 C 和 C++ 都提供了文件读写的类库,不过 Qt 也有一套自己的文件读写操作;本文主要介绍 Qt 中进行文件读写操作的类 —— QFile 。         一般的桌面应用程序,当我们想要打开一个文件时,通常会弹出一个文件对话框。在 Qt 中,文件对话框使用 QFileDial

    2024年02月12日
    浏览(40)
  • c++文件操作(2)-- 按照指定格式读写文件

    目录 按照指定格式写文件 代码说明:   按照指定格式读文件 -- 解析一定格式的字符串 代码说明:  注意:  问: 为什么使用getline()?   在实际开发中,我们以一定的格式写入文件当中。  其实就是使用stringstream类对象来实现。   代码说明:   大部分操作和写文件类似,只是

    2024年01月24日
    浏览(37)
  • 5.1 文件操作(读写、追加等)

    在 Python 中,文件操作是一项常用的任务。本节将介绍如何执行基本的文件操作,如读取、写入和追加数据。我们将通过实例代码详细讲解每个知识点。 在对文件进行操作之前,我们需要使用  open()  函数打开它。 open()  函数接受两个参数:文件名(包括路径)和模式。以下

    2024年02月08日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包