文件的输入输出函数

article/2025/10/11 19:54:51

文章目录

  • 前言
  • 字符输入输出函数 - fgetc和fputc
  • 文本输入输出函数 - fgets和fputs
  • 格式化输入输出函数 - fscanf和fprintf
  • 二进制输入输出函数 - fread和fwrite


前言

在文件操作函数(一)中,我们已经学会了怎样正确地打开和关闭一个文件,即我们已经学会了一件事的开头和结尾,不要以为已经结束了,这才刚刚开始,真正重要的是打开了文件后,如何操作文件中的数据(输入数据和输出数据)。

对文件数据的读写可以分为顺序读写随机读写。顺序读写,即挨着顺序对文件中的数据进行输入或输出。

在这片博客中,我们首先介绍文件的顺序读写需要用到的文件操作函数。

字符输入输出函数 - fgetc和fputc

一、fputc函数

int fputc( int c, FILE *stream );

fputc函数的第一个参数是待输出的字符,第二个参数该字符输出的位置,即fputc函数的功能是将一个字符输出到指定的位置。该函数调用完毕会返回用户传入的字符。

例如,我们要将小写字母a~z写入到data.txt文件中。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输出字符操作char i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}

二、fgetc函数

int fgetc( FILE *stream );

fgetc函数只有一个参数,即你要读取的文件的文件指针。fgets函数的功能就是从指定位置读取一个字符。该函数调用成功会返回读取到的的字符;若读取文件时发生错误,或是已经读取到文件末尾,则返回EOF。

例如,我们要将文件data.txt文件中的内容全部读取,并打印到屏幕上。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输入字符操作int ch = 0;while ((ch = fgetc(pf))!= EOF){printf("%c", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

文本输入输出函数 - fgets和fputs

一、fputs函数

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

fputs函数的第一个参数是待输出的字符串,第二个参数该字符串输出的位置,即fputs函数的功能是将一个字符串输出到指定的位置(有没有发现fputs函数的参数设计和fputc函数参数的设计非常类似)。该函数调用成功会返回一个非负值;若输出时发生错误,则返回EOF。

例如,我们要将字符串"hello world!"写入到data.txt文件中。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输出字符串操作char arr[] = "hello world!";fputs(arr, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

二、fgets函数

char *fgets( char *string, int n, FILE *stream );

fgets函数的第三个参数是你要读取的文件的文件指针,第二个参数是你要读取的字符个数(也可以说是字节个数),第一个参数是你所读取到的数据的储存位置。fgets函数的功能就是从指定位置读取指定字符个数的数据储存到指定位置。该函数调用成功会返回用于储存数据的位置的地址,如果读取过程中发生错误,或是读取到了文件末尾,则返回一个空指针(NULL)。

例如,我们要从data.txt文件中提取数据。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输入字符串操作char arr[10] = { 0 };fgets(arr, 6, pf);printf("%s\n", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

fgets函数读取字符的过程中会出现两种情况:
1.在fgets函数读取到指定字符数之前,若读取到换行符(’\n’),则停止读取,读取带回的字符包含换行符。
2.直到fgets函数读取到第n-1个字符时都没有遇到换行符(’\n’),则返回读取到的n-1个字符,并在末尾加上一个空字符一同返回(共n个字符)。

格式化输入输出函数 - fscanf和fprintf

一、fprintf函数

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

fprintf函数的第一个参数是数据输出的目的地,后面的参数博友们可能看不太懂,但是我们可以看看库函数printf函数的函数声明:

int printf( const char *format [, argument]... );
//printf函数的声明

我们发现fprintf函数除了第一个参数以外,其它参数都与printf函数的参数一样,虽然我们不知道fprintf函数后面的参数代表的意思,但是我们会用printf函数啊,所以我们使用fprintf函数传参时可以模仿者printf的传参形式。

例如我们要将一个结构体类型的变量信息输出到data.txt文件中去。

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行格式化输出操作struct S s = { "zhangsan", "nan", 20 };fprintf(pf, "%s %s %d\n", s.name, s.sex, s.age);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
其实,fprintf函数的功能就是将“区域三”的数据,以“区域二”的格式输出到“区域一”。
二、fscanf函数

二进制输入输出函数 - fread和fwrite

一、fwrite函数

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

fwrite函数的第一个参数是输出数据的位置,第二个参数是要输出数据的元素个数,第三个参数是每个元素的大小,第四个参数是数据输出的目标位置。该函数调用完后,会返回实际写入目标位置的元素个数,当输出时发生错误或是待输出数据元素个数小于要求输出的元素个数时,会返回一个小于count的数。

概括一下,fwrite函数的功能就是将buffer位置的,每个元素大小为size的,count个元素,以二进制的形式输出到stream位置。
在这里插入图片描述

例如,我们要将数组arr中的10个元素以二进制的形式输出到data.txt文件中去。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "wb");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件以二进制形式进行输出操作int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };fwrite(arr, sizeof(int), 10, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

注:此时打开文件的形式应为"wb",即以二进制的形式打开文件,进行输出操作。

二、fread函数

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

fread函数的第一个参数是接收数据的位置,第二个参数是要读取的每个元素的大小,第三个参数是要读取的元素个数,第四个参数是读取数据的位置。函数调用完会返回实际读取的元素个数,若在读取过程中发生错误或是在未读取到指定元素个数时读取到文件末尾,则返回一个小于count的数。
概括一下,fread函数的功能就是从stream位置,以二进制的形式读取count个每个元素大小为size的数据,到buffer位置。

例如,我们要将刚才用fwrite函数输出到data.txt文件的数据读取出来。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "rb");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件以二进制形式进行输入操作int arr[10] = { 0 };fread(arr,sizeof(int),10,pf);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}//将arr中的内容打印出来,看是否读取成功//关闭文件fclose(pf);pf = NULL;return 0;
}

注:此时打开文件的形式应为"rb",即以二进制的形式打开文件,进行输入操作。


http://chatgpt.dhexx.cn/article/n5i5ruT1.shtml

相关文章

计算机网络 | 传输层的两个重要协议——TCP、UDP

目录 传输层概述 传输层的作用 运输层端口号、复用与分用的概念 发送方的复用和接收方的分用 UDP和TCP的对比 TCP的流量控制 TCP的拥塞控制 TCP的差错控制 UDP的差错控制的和流控 TCP的封装格式 TCP主要特点 TCP的连接 可靠传输的工作原理 TCP连接的三次握手和四次挥…

以太网协议

以太网(Ethernet) 以太网是一种局域网技术,其规定了访问控制方法、传输控制协议、网络拓扑结构、传输速率等,完成数据链路层和物理层的一些内容,它采用一种称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(Carrier Sense, Multiple Access with Collisi…

传输层TCP协议和UDP协议

传输层协议 文章目录 传输层协议传输层&#xff1a;传输层协议&#xff1a;UDP协议&#xff1a;TCP协议&#xff1a;UDP协议和TCP协议的比较&#xff1a;适用场景&#xff1a; 传输层&#xff1a; 传输层是OSI中最重要&#xff0c;最关键的一层,是唯一负责总体的数据传输和数据…

文件传输协议FTP

文件传输协议FTP(File Transfer Protocol)是因特网中使用最广泛的文件传输协议。FTP使用交互式的访问&#xff0c;允许客户指定文件的类型和格式(如指明是否使用ASCII码)&#xff0c;并允许文件具有存取权限(如访问文件的用户必须经过授权&#xff0c;并输入有效的口令)。 文件…

传输层协议详解

一、传输层的概念和服务 1、传输层的基本概念 传输层负责端到端之间的数据传输控制传输层依赖于网络层的服务&#xff0c;对应用层提供传输服务 2、传输层的功能 跟踪会话 跟踪源主机和目的主机上应用程序间的每次通信 数据分段 将数据分段&#xff0c;并管理每个分段 …

TCP-面向连接的传输层协议

TCP 主要特点工作方式建立连接---三次握手为什么 TCP 建立连接需要三次握手&#xff0c;而不是两次&#xff1f;连接终止---四次挥手为什么要四次挥手为什么要等待2MSL TCP流量控制TCP拥塞控制1.慢开始和拥塞避免2.快重传和快恢复 传输控制协议&#xff08;TCP&#xff0c;Tran…

简介 传输层协议——UDP协议

UDP协议&#xff1a; UDP&#xff1a;User Datagram Protocol 用户数据报协议 UDP简介&#xff1a; UDP是一种面向无连接的传输层协议&#xff0c;UDP数据包括目的端口号和源端口号信息&#xff0c;由于通讯不需要连接&#xff0c;所以可以实现广播发送。UDP提供面向事务的简…

TCP(传输控制协议详解)详解

TCP协议的特点 &#xff08;1&#xff09;TCP协议是面向连接的运输层协议 在数据传输前必须建立连接&#xff0c;数据传输之后释放连接。 &#xff08;2&#xff09;TCP提供可靠交付的服务 所谓可靠是指在传输过程中无重复&#xff0c;无丢失&#xff0c;无错误。但是同时会…

TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)

TCP/IP协议 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff09;是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议&#xff0c;而是指一个由FTP、SMTP、TCP、UDP、IP等协…

用户数据报协议UDP和传输控制协议TCP

目录 UDP UDP的功能 UDP的特点 UDP的首部格式 TCP TCP的功能 TCP的特点 TCP面向流的概念 套接字&#xff08;socket) 无连接工作流程和面向连接的工作流程对比 UDP UDP的功能 UDP只在IP的数据报服务上增加了很少一点功能&#xff1a; 1.复用和分用功能 2.差错检测…

TCP(传输控制协议)

TCP 最主要的特点 TCP 是应用程序在使用 TCP 协议之前&#xff0c;必须先建立 TCP 连接。 在传送数据完毕后&#xff0c;必须释放已经建立的 TCP 连接面向连接的运输层协议每一条 TCP 连接只能有两个&#xff0c;每一条 TCP 连接只能是(一对一)点对点TCP 提供的服务。 通过 TCP…

传输层-传输控制协议(TCP)

目录 TCP 协议概述TCP 报文段结构TCP连接管理三次握手四次挥手 TCP 可靠数据传输TCP拥塞控制 TCP 协议概述 传输控制协议&#xff08;TCP&#xff09;是Internet传输层协议。提供面向连接、可靠、有序、字节流传输服务。 面向连接&#xff1a;应用程序在使用 TCP 之前&#x…

传输控制协议---TCP协议【详解】

目录 一、协议简介 二、TCP报文格式 1、字段解析 2、报文解析 三、TCP的重传机制 1、超时重传 2、快速重传 3、 SACK 方法 4、Duplicate SACK 四、TCP的滑动窗口机制 五、流量控制 六、拥塞机制 1、慢启动 2、拥塞避免算法 3、拥塞发生 4、快速恢复 七、TCP的三…

传输控制协议(TCP)

可靠的流传输服务 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。本文介绍TCP把他当成TCP/IP网际协议族的一部分&#xff0c;是一个独立的通信协议。 五个可靠交付特征 1.面向流…

传输控制协议TCP

一、概述 概念&#xff1a;传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP最主要的特点&#xff1a; &#xff08;1&#xff09;TCP是面向连接的运输层协议。 &#xff08;2&a…

[2] SDL的基础知识以及利用SDL播放视频

此博文相关知识点从雷神的博客以及视频学习&#xff0c;截图也是用了他的课件, 雷神博客地址&#xff1a;http://blog.csdn.net/leixiaohua1020/ 日期&#xff1a;2016.10.1 作者&#xff1a;isshe github&#xff1a;github.com/isshe 邮箱&#xff1a;i.ssheoutlook.com …

Start Game:SDL2简介

Start Game&#xff1a;SDL2简介 官网简介&#xff1a; Simple DirectMedia Layer是一个跨平台开发库&#xff0c;旨在通过OpenGL和Direct3D提供对音频、键盘、鼠标、操纵杆和图形硬件的低级别访问。它被视频播放软件、模拟器和流行游戏使用&#xff0c;包括Valve的获奖目录和许…

SDL2的学习之路<三>显示文字

前言 上节介绍了怎么利用SDL接口去显示图片&#xff0c;这节主要介绍怎么去显示文本信息。 SDL2展示文字需要在官网下载SDL2_ttf的扩展库。这个第一节已经讲过了。 使用时需要先初始化库&#xff0c;使用结束时释放库资源。 TTF_Init(); //初始化库 … TTF_Quit(); //释放 显…

VS2019配置SDL2库

“SDL&#xff08;Simple DirectMedia Layer&#xff09;是一套开放源代码的跨平台多媒体开发库&#xff0c;使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数&#xff0c;让开发者只要用相同或是相似的代码就可以开发出跨多个平台&#xff08;Linux、Windows、MacOS…

SDL系列教程(一):SDL简介

SDL教程&#xff08;一&#xff09; 作者&#xff1a;akinggw 在阔别半年后&#xff0c;我又回来了。这次回来&#xff0c;首先要向大家问声好&#xff0c;然后继续我们的游戏开发之旅。在以前的日子里&#xff0c;我主要在翻译一些游戏开发方面的文章&#xff0c;而现在&…