C语言【文件操作 2】

news2024/11/18 19:41:25

文章目录

  • 前言
  • 顺序读写函数的介绍
    • fputc && fgetc
      • fputc
      • fgetc
    • fputs && fgets
      • fputs
      • fgets
    • fprintf && fscanf
      • fprintf
      • fscanf
    • fwrite && fread
      • fwrite
      • fread
  • 文件的随机读写
    • fseek函数
    • 偏移量
    • ftell函数
    • rewind函数
  • 文件的结束判断
    • 被错误使用的feof
  • 结语

前言

在前面的文章我们讲解了文件操作的基础:点击此处浏览前文下面正式讲解文件的操作函数
注意:因为本章讲解的文件操作,所以大多数函数使用环境默认是文件!!!

顺序读写函数的介绍

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

上面说的适用与所有输入流一般指的是适用于标准输入流与其他输入流(例如文件输入流);所有输出流指的是适用于标准输出流与其他输出流(例如文件输出流)。

fputc && fgetc

fputc

将一个字符输出到文件

int fputc(int c, FILE* stream);

参数为什么是int类型呢?

因为传递的是ASCII码值

为什么会返回int类型的值呢?返回的是什么呢?
cpp网站是这样写的:

On success, the character written is returned.
If a writing error occurs, EOF is returned and the error indicator (ferror) is set.

大致意思就是:

如果写入成功,返回被写入的字符的ASCII码值
如果写入失败,返回EOF并设置错误提示符

例子:

#include<stdio.h>

int main()
{
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	for (char c = 'A'; c <= 'Z'; c++)
	{
		fputc(c, pf);//将字符输入到文件中
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fgetc

从文件中读取一个字符

int fgetc(FILE* stream)

返回的是ASCII码值

关于fgetc的返回值cpp网站是这样写的

On success, the character read is returned (promoted to an int value).
The return type is int to accommodate for the special value EOF, which indicates failure:
If the position indicator was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stream.
If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

大致意思是:

如果读取成功,返回被读取字符的ASCII码值;
若读取失败或文件光标已经到了文件末尾(就是没字符可以读了),则会返回EOF

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	int c;
	while ((c = fgetc(pf)) != EOF)
	{
		printf("%c ", c);
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

fputs && fgets

fputs

将字符串输出到文件

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

关于返回值

cpp网站是这样写的:

On success, a non-negative value is returned.
On error, the function returns EOF and sets the error indicator (ferror).

大致意思:

输出成功,返回一个非负数;
输出失败,返回EOF

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	char str[100] = "Hello World";
	fputs(str, pf);//数组名是数组首元素地址
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fgets

读取指定位置范围内的字符串

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

str:用于接收字符串
num:一次读num-1个字符(fgets会默认在第num处存放’\0’)

关于返回值
cpp网站是这样写的:

On success, the function returns str.
If the end-of-file is encountered while attempting to read a character, the eof indicator is set (feof). If this happens before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged).
If a read error occurs, the error indicator (ferror) is set and a null pointer is also returned (but the contents pointed by str may have changed).

大致意思就是:

读取成功,返回str的地址;
读取失败或文件已到末尾,返回NULL;

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
		return;
	}
	char buf1[100] = { 0 };
	char* str1;
	str1 = fgets(buf1, 12, pf);//这是我明确知道文件有多少个元素
	printf("明确知道:");
	printf("%s", str1);

	printf("\n");
	rewind(pf);//将光标返回文件初始位置

	//假设我们不知道文件内有多少个元素
	char buf2[100] = { 0 };
	char* str2;

	printf("并不明确:");
	while ((str2 = fgets(buf2, 2, pf)) != NULL)
	{
		printf("%s", str2);
	}

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

在这里插入图片描述

fprintf && fscanf

fprintf

将数据以格式化的形式输出到文件

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

fprintfprintf很像,只是printf是输出到标准输出流(屏幕);而·printf是可以输出到指定输出流中

例子:

#include<stdio.h>
typedef struct st
{
	char _Name[20];
	int _Score;
	char _SId[17];
}Stu;

int main()
{
	Stu student = { "zhangsan" , 99, "202300002024" };
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	fprintf(pf, "%s %d %s", student._Name, student._Score, student._SId);

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

在这里插入图片描述

fscanf

从文件输出格式化的数据

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

同理,fscanfscanf也是很相似的;只不过scanf是从标准输入流(键盘)得到数据,fscanf是从指定的输入流中得到数据

例子:

#include<stdio.h>
typedef struct st
{
	char _Name[20];
	int _Score;
	char _SId[17];
}Stu;

int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	Stu x = { 0 };
	fscanf(pf, "%s %d %s", x._Name, &(x._Score), x._SId);
	printf("%s %d %s", x._Name, x._Score, x._SId);

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
注意:上面的函数可以使用到任意的指定流中;
当然也要遵守语法:该是输出流给输出流,该是输入流给输入流

就拿fprintf举例

#include<stdio.h>
typedef struct st
{
	char _Name[20];
	int _Score;
	char _SId[17];
}Stu;
int main()
{
	Stu student = { "zhangsan" , 99, "202300002024" };
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	fprintf(stdout, "%s %d %s", student._Name, student._Score, student._SId);
	//stdout是标准输出流

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

在这里插入图片描述

fwrite && fread

这两个函数只能用文件流(也就是只能输入输出到文件)

fwrite

以二进制的形式输出数据到文件(只能输入到文件)

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

ptr->要输入的数据
size->数据的大小
count->数据的个数

例子:

#include<stdio/h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	FILE* pf = fopen("text.txt", "wb");//只写(以二进制形式)
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	fwrite(arr, sizeof(arr[0]), 10, pf);

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

在这里插入图片描述

fread

以二进制的形式从文件中读取数据

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

ptr->用于接收数据
size->数据的大小
count->数据的个数

关于返回值

cpp网站是这样写的

The total number of elements successfully read is returned.
If this number differs from the count parameter, either a reading error occurred or the end-of-file was reached while reading. In both cases, the proper indicator is set, which can be checked with ferror and feof, respectively.
If either size or count is zero, the function returns zero and both the stream state and the content pointed by ptr remain unchanged.
size_t is an unsigned integral type.

大致意思为:

如果读取成功,返回成功读取的元素个数。
如果这个数字与 count 参数不同,要么是发生了读取错误,要么是在读取过程中到达了文件终点。
如果 size 或 count 均为零,函数返回零,流状态和 ptr 指向的内容均保持不变。

例子:

#include<stdio.h>

int main()
{
	FILE* pf = fopen("text.txt", "rb");//只读(以二进制形式)
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	int arr[10] = { 0 };
	fread(arr, sizeof(arr[0]), 10, pf);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

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

在这里插入图片描述

文件的随机读写

fseek函数

根据文件指针的位置和偏移量来定位文件指针。

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

偏移量

文件指针所指向的位置距离文件起始位置有多少个数据

文件起始位置有三种(下列表格在cpp网站的fseek函数中)

ConstantReference position
SEEK_SETBeginning of file
SEEK_CURCurrent position of the file pointer
SEEK_ENDEnd of file *

SEEK_SET:文件的开始位置
SEEK_CUR:文件指针当前的位置
SEEK_END:文件的末尾
如果fseek给的起始位置是SEEK_END,那么访问前面的元素,偏移量就要给负数

例子:

#include<stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("text.txt", "w");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
这是为什么呢?
我们来看图吧。
在这里插入图片描述

ftell函数

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

long int ftell ( FILE * stream );

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	for (int i = 0; i < 5; i++)
	{
		fgetc(pf);
	}
	printf("偏移量为%d ",ftell(pf));
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

rewind函数

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

void rewind ( FILE * stream );

前面的例子也使用过:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
		return;
	}
	char buf1[100] = { 0 };
	char* str1;
	str1 = fgets(buf1, 18, pf);//这是我明确知道文件有多少个元素
	printf("明确知道:");
	printf("%s", str1);

	printf("\n");
	rewind(pf);//将光标返回文件初始位置

	//假设我们不知道文件内有多少个元素
	char buf2[100] = { 0 };
	char* str2;

	printf("并不明确:");
	while ((str2 = fgets(buf2, 2, pf)) != NULL)
	{
		printf("%s", str2);
	}

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

在这里插入图片描述

文件的结束判断

被错误使用的feof

牢记:在文件读取的过程中,不能用feof函数的返回值来直接判断文件是否结束。
feof的作用是:当文件已经读取结束时,判断结束的原因是否为“遇到文件尾部结束”。

文本文件读取是否结束。判断返回值是否为EOF (fgetc),或NULL(fgets)。
二进制文件读取是否结束,判断返回值是否小于实际要读的数。

cpp的网站->https://cplusplus.com/

结语

最后感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!!!

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

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

相关文章

哈希题目总结

以下列举了可以用哈希方法&#xff08;包括但不限于用HashMap和HashSet&#xff09;的题目&#xff0c;实质上是把东西丢给这些数据结构去维护。请注意有些题目中用哈希是最优解&#xff0c;有些题目中不是最优解&#xff0c;可以自行探索其时间复杂度和空间复杂度的区别&#…

【Java】还不会数组?一文万字全搞定

前言&#xff1a;前面两章我们详细讲解了Java基本程序设计结构中的基本知识&#xff0c;&#xff0c;包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串&#xff0c;输入输出&#xff0c;控…

探索精酿啤酒:从经典到创新

Fendi club啤酒一直以来都以其卓着的品质和与众不同的口感深受消费者喜爱。而随着时代的变迁和消费者口味的不断变化&#xff0c;Fendi club啤酒也在不断地探索和创新&#xff0c;以满足市场的多样化需求。 在经典的口感和风味基础上&#xff0c;Fendi club啤酒不断地尝试新的原…

多线程学习D10 收尾了应该

线程安全集合类概述 重点介绍java.util.concurrent.* 下的线程安全集合类&#xff0c;可以发现它们有规律&#xff0c;里面包含三类关键词&#xff1a;Blocking、CopyOnWrite、Concurrent Blocking 大部分实现基于锁&#xff0c;并提供用来阻塞的方法 CopyOnWrite 之类容器修改…

探讨关于AutoPSA里CII算法的结构荷载

UKP3D,AutoPDMS导出应力计算文件至管道应力分析软件分析&#xff0c;如下图AutoPSA.用户咨询如图 1.如果计算时考虑水重&#xff0c;把工况中的w改为ww&#xff1b; 2.CAD表格中结构荷载不是单纯的1.5倍&#xff0c;是参照仿GLIF的算法&#xff0c;计算了水重的&#xff08;根…

如何进行资产梳理

前言 为什么要进行资产梳理&#xff1f; 资产梳理方式一: 一、安全防护设备资产 二、对外开放服务项目资产 三、项目外包业务流程资产 资产梳理方式二: 一、业务资源梳理 二、设备资产梳理 三、第三方的服务信息梳理 风险梳理 风险有哪些&#xff1f; 一,账号权限风…

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径&#xff0c;具体位置为 系统->系统信息->高级系统设置->高级->环境…

Core_Air724UG学习

产品描述 Core_Air724UG核心板是基于Air724UG cat1模板制作的开发实验板。 该模块支持Lua二次开发或AT指令&#xff0c;方便开发者根据自己的需求灵活选择。 Core_Air724UG核心板专注于小型化&#xff0c;PCB尺寸4246mm&#xff0c;有12x22哥标准2.54mm排针管脚&#xff0c;其…

Android MediaCodec 简明教程(七):使用 MediaCodec 解码到 OES 纹理上

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

安装oh-my-zsh(命令行工具)

文章目录 一、安装zsh、git、wget二、安装运行脚本1、curl/wget下载2、手动下载 三、切换主题1、编辑配置文件2、切换主题 四、安装插件1、zsh-syntax-highlighting&#xff08;高亮语法错误&#xff09;2、zsh-autosuggestions&#xff08;自动补全&#xff09; 五、更多优化配…

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

【bug记录】清除僵尸进程,释放GPU显存

目录 1. 为什么会出现这种情况&#xff1f;2. 解决方案方法一&#xff1a;使用 fuser 命令方法二&#xff1a; 3. 小贴士 在进行深度学习或其他需要GPU支持的任务时&#xff0c;我们有时会发现虽然没有可见的进程在执行&#xff0c;但GPU资源却意外地被占用。这种情况往往会阻碍…

Redis(无中心化集群搭建)

文章目录 1.无中心化集群1.基本介绍2.集群说明 2.基本环境搭建1.部署规划&#xff08;6台服务器&#xff09;2.首先删除上次的rdb和aof文件&#xff08;对之前的三台服务器都操作&#xff09;1.首先分别登录命令行&#xff0c;关闭redis2.清除/root/下的rdb和aof文件3.把上次的…

(23)实时采集微信消息(基于主窗体)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

HDLbits 刷题 -- Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. 译&#xff1a;考虑下面卡诺图中显示的函数f。 实现这个函数。D是dont-care&#xff0c;这意味着…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…

Python ValueError: bad transparency mask

修改前 修复后 运行正常 from PIL import Image# 读取图片 #报错信息解决ValueError: bad transparency mask--相关文档地址https://blog.csdn.net/kalath_aiur/article/details/103945309 #1. 检查 alpha 通道是否是一个有效的掩码。如果不是&#xff0c;则需要对 alpha 通道…

随机梯度下降SGD的理解和现象分析

提出问题&#xff1a;令人疑惑的损失值 在某次瞎炼丹的过程中&#xff0c;出现了如下令人疑惑的损失值变化图像&#xff1a; 嗯&#xff0c;看起来还挺工整&#xff0c;来看看前10轮打印的具体损失值变化&#xff1a; | epoch 1 | iter 5 / 10 | time 1[s] | loss 2.3137 |…

Hadoop3:HDFS的Shell操作(常用命令汇总)

一、简介 什么是HDFS的Shell操作&#xff1f; 很简单&#xff0c;就是在Linux的终端&#xff0c;通过命令来操作HDFS。 如果&#xff0c;你们学习过git、docker、k8s&#xff0c;应该会发现&#xff0c;这些命令的特点和shell命令非常相似 二、常用命令 1、准备工作相关命令…