C语言:文件操作(中)

news/2024/9/23 22:28:10/

片头

嗨!小伙伴们,大家好!在上一篇中,我们学习了C语言:文件操作(上),在这一篇中,我们将继续学习文件操作,准备好了吗?Ready Go ! ! !

 文件的顺序读写

来复习一下这个表格

函数名功能适用于
fgetc字符输入函数/读所有输入流(stdin-标准输入流和文件输入流)
fputc字符输出函数/写所有输出流(stdout-标准输出流和文件输出流)
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件输入流
fwrite二进制输出文件输出流

在上一篇中,我们学习了fgetc、fputc、fgets、fputs函数,今天我们来讲解后面几个函数~

1 fprintf函数

fprintf函数是C语言标准库中的一个输出函数,用于将格式化的数据输出到指定的文件中。

函数声明如下:

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

 参数意义如下:

stream: 表示文件指针,用于指定输出的目标文件

format: 是一个格式化字符串,指定输出的格式

....... : 表示可变参数,用于提供要输出的数据

通过对比,我们可以观察到,fprintf函数和printf函数差不多, fprintf函数只不过多了一个参数FILE* stream,printf函数是将数据输出到标准输出流(stdout)【类似于:显示器界面(控制台)】,而fprintf函数是将数据输出到指向文件的指针stream(指针类型为 FILE*)中。

代码如下:

#include<stdio.h>
//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};int main() {//定义一个结构体变量s,分别对属性进行初始化struct Stu s = { "zhangsan",24,98.00000 };//以“只写”的方式打开文件FILE* pfwrite = fopen("data.txt", "w");if (pfwrite == NULL) {perror("fopen->pfwite");return 1;}//将信息输出到流中fprintf(pfwrite,"%s %d %.1f", s.name, s.age, s.score);//关闭文件fclose(pfwrite);pfwrite = NULL;//置空return 0;
}

运行结果如下:

fprintf函数的返回值是成功输出的字符数。如果出现错误则返回负数。函数会根据format字符串中的格式指示符,将可变参数列表中的数据按照指定的格式输出到文件中。

2 fscanf函数

fscanf函数是C语言标准库中的一个输入函数,用于从文件中读取格式化的数据。它可以根据给定的格式字符串从文件中读取数据,并将读取到的数据存储到对应的变量中。

函数原型如下:

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

参数说明:
- stream:指向要读取的文件的指针。
- format:格式化字符串,指定了要读取的数据的格式。
- ...:可变参数,用来接收读取到的数据的变量。

通过对比,我们可以发现,其实 fscanf 函数和 scanf 函数差不多,fscanf函数只不过多了一个参数FILE* stream,scanf函数是从标准输入流(从键盘中)读取数据,fscanf函数是从指向文件的指针stream(指针类型为 FILE*)中读取数据。

代码如下:

#include<stdio.h>//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};
int main() {
//定义一个结构体变量s,初始化为0struct Stu s = { 0 };
//以“只读”的模式,打开文件FILE* pfread = fopen("data.txt", "r");
//从文件中读取属性值fscanf(pfread,"%s %d %f", s.name, &(s.age), &(s.score));
//在控制台上打印属性值fprintf(stdout,"%s %d %.1f", s.name, s.age, s.score);//关闭文件fclose(pfread);pfread = NULL;//置空return 0;
}

运行结果如下:

这样,我们就成功地使用fscanf函数从文件中读取了数据。需要注意的是,fscanf函数会按照格式化字符串中的格式要求进行读取,如果格式不匹配,可能会导致读取错误或结果不正确。因此,在使用fscanf函数时,要确保格式化字符串与文件中的数据格式相匹配。 

3 fwrite函数

fwrite函数是C语言中的一个文件操作函数,用于向文件中写入数据。

函数原型如下:

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

参数含义如下:

ptr: 指向要写入的数据的指针

size: 每个数据项的大小(以字节为单位) 

count: 要写入的数据项的个数

stream: 指向要写入的文件的指针

返回值: 成功写入数据的个数

fwrite函数将指定的数据写入文件,写入的数据来自指针ptr指向的内存区域。写入的数据项大小为size字节,总共写入count个数据项。函数调用成功后,返回实际写入的数据项个数,如果返回值与count不相等,可能是因为写入出错或到达文件末尾。

fwrite函数一般用于向二进制文件中写入数据,例如将内存中的结构体保存到文件中。它可以写入任意类型的数据,包括整数、浮点数、字符等。

代码如下:

//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};int main() {//定义一个结构体变量s,分别对属性进行初始化struct Stu s = { "zhangsan",18,95.00000 };//以二进制的模式读和写FILE* pf = fopen("data.txt", "wb");if (pf == NULL) {perror("pf");return 1;}//二进制输出到流中fwrite(&s, sizeof(s), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果如下:

 

4 fread函数

 fread函数时C语言中的文件输入函数,用于从文件中读取指定数量的数据项,并将其存储到指定的内存块中。它的函数原型如下:

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

 参数说明:

ptr: 指向存储数据的内存块的指针。

size: 每个数据项的字节数。

count: 要读取的数据项的数量

stream: 文件指针,指向要读取的文件。

返回值:为实际读取的数据项数量。

fread函数按照指定的size和count来计算要读取的总字节数,并将这些字节从文件中读取到ptr指向的内存块中。读取的位置随着每次读取而向后移动。

fread函数常用于读取二进制文件,可以读取任意类型的数据。读取字符串时,需要注意字符串结束标志'\0'字符,因为fread函数不会自动追加字符串结束符。

代码如下:

//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};//定义一个结构体变量s,初始化为0
int main() {struct Stu S = { 0 };FILE* pf = fopen("data.txt", "rb");if (pf == NULL) {perror("pf");return 1;}//以二进制的形式读文件fread(&S, sizeof(S), 1, pf);//输出属性值printf("%s %d %f\n", S.name, S.age, S.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果如下:

 片尾

今天我们学习了另外4个函数,分别是fprintf函数,fscanf函数,fwrite函数,fread函数,希望看完这篇文章能对友友们有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!


http://www.ppmy.cn/news/1450613.html

相关文章

J2EE模式

系列文章目录 J2EE模式特别关注表示层&#xff0c;这些模式是由 Sun Java Center 鉴定的&#xff0c; 包括&#xff1a; 1、 MVC模式&#xff08;MVCPattern&#xff09;&#xff1b; 2、 业务代表模式&#xff08;BusinessDelegatePattern&#xff09;&#xff1b; 3、 组合…

C语言-嵌入式-STM32:有哪些接口协议?

STM32微控制器支持多种接口协议以适应不同的通信需求&#xff0c;以下是一些常见的接口协议&#xff1a; USART/UART (Universal Synchronous/Asynchronous Receiver-Transmitter): USART 是同步或异步串行通信接口&#xff0c;常用于设备与PC之间的简单数据传输&#xff0c;如…

社交媒体数据恢复:Tandem

Tandem数据恢复方法 1. 概述 Tandem 是致力於提供語言學習者和母語者交流的語言交換app&#xff0c;已發行iOS及Android版本。 使用者可以透過文字或者語音對談找到語言交換對象。 該應用程序於2020年4月支援超過160種語言&#xff0c;其中包含12種手語。 2. 操作步骤 2.1.…

websocket全局封装使用

WebSocket对象的创建 WebSocket对象的关闭 启用心跳机制&#xff0c;避免断连 消息推送&#xff0c;接收到消息后进行业务逻辑处理 重连机制&#xff0c;如果断连后尝试一定次数的重连&#xff0c;超过最大次数后仍然失败则关闭连接 调用案例如下&#xff1a; const socketMana…

llamaindex 中GPTVectorStoreIndex 和 VectorStoreIndex区别

在 llama_index 库中,GPTVectorStoreIndex 和 VectorStoreIndex 都是用于创建向量存储索引的类,但它们在某些方面有所不同。 底层模型: GPTVectorStoreIndex 使用 GPT (Generative Pre-trained Transformer) 模型来生成文本的向量表示。它利用 GPT 模型的上下文理解能力来捕获…

centos学习-压缩和解压缩命令

CentOS 压缩与解压缩命令详解 在CentOS操作系统中&#xff0c;压缩和解压缩命令是极为常用的工具&#xff0c;用于对文件进行打包、压缩和解压缩操作。这些命令能够方便地处理大量的文件&#xff0c;使其更易于拷贝、移动和存储。本文将详细介绍CentOS中常见的压缩解压缩命令的…

身份证号对应地区信息-MySQL

这里写自定义目录标题 MySQL表结构MySQL表对应数据 MySQL表结构 CREATE TABLE idcard_contrast (code varchar(2000) NOT NULL COMMENT 身份证前六位,value varchar(3000) DEFAULT NULL COMMENT 对应地址 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT身份证对照表;MySQL表对…

Java虚拟机(JVM)之字节码文件

让我们先来简单了解一下JVM。 JVM功能&#xff1a; 1、解释和运行&#xff1a;对字节码文件中的指令&#xff0c;实时的解释成机器码让计算机执行。 2、内存管理&#xff1a;自动为对象、方法等分配内存&#xff1b;自动的垃圾回收机制&#xff0c;回收不再使用的对象。 3、即…