还在挣扎文件

news2024/9/21 22:56:56

由于在老式打印机里面每打下一行都要进行回车和换行,在windows系统里面也延续了这个惯例,但是c语言是只有换行,但是为了兼容,会自动进行转换;比如,它在写入文件的时候换行会自动转换为回车加换行,而读取文件的时候则是将回车将换行读取为回车;这时候编译器是把文件当作文本处理,如果不想把它们当作文本处理,这时候就可以把操作模式写成rb或者wb(binary意为二进制的),这里是把他们当作二进制处理(这样就不会有自动转换了)(但是不建议,虽然写入的时候好像没什么差错,但是读取的时候会有缺陷,暂时不明白原因);

下面再介绍fscanf函数:它的参数除了文件指针其他的和scanf函数没什么区别,它是读取文件里的内容的,这里举个例子:

#include<stdio.h>


int main()
{
	FILE* fp = fopen("D:\\文件\\ww.txt","rb");
	if (!fp)return -1;
	//char bu[10];
	/*while (fgets(bu, 10, fp) != NULL)
	{
		printf("%s", bu);
	}*/
	int f;
	fscanf(fp, "%d", &f);
	printf("%d", f);

	fclose(fp);
	return 0;
}

用这个代码可以读取刚刚的文本1234567相当于一个数字且在int范围内。但是要注意,在这个里面要记得把模式换位只读模式,而不是只写模式,否则就会读取错误;(这个w也就是只写操作的用法是真的要注意);

#include<stdio.h>


int main()
{
	FILE* fp = fopen("D:\\文件\\ww.txt","r");
	if (!fp)return -1;
	//char bu[10];
	/*while (fgets(bu, 10, fp) != NULL)
	{
		printf("%s", bu);
	}*/
	int f;
	char a;
	fscanf(fp, "%d%c", &f,&a);

	printf("%d", f);
	printf("%c", a);

	fclose(fp);
	return 0;
}

但是在这段代码里面结果是这样的:

 也就是文本里面的换行也会被当作一个字符处理这时候就要注意了,有时候我们读取的是下一行的字符,就会不小心读成换行,所以这时候可以用一个函数fgetc(可以这么记:在getchar函数前加了一个f并省略了后面的)函数,这个函数的原型是这样的:int fgetc(文件类型的指针)它的原理:如果读取字符成功,返回这个字符的ASCII码,读取失败或到了文件结尾则返回EOF,先来介绍一下end of file 也就是EOF 它的宏定义是这样的:

#define EOF (-1)

在stdio.h头文件里面;可以用两外两个函数测试它们是那种错误:

feof用于文件是否结尾ferror用于文件读取是否出错,(这里怎么样才算读取出错呢?也就是要去读取该文件的时,该文件却是不可读的,这就会读取失败);他们的函数原型差不多:

int feof(文件类型的指针);
int ferror(文件类型的指针);

如果是它们对应的错误就是返回非零也就是真,否则为0即假;来看这段代码:

#include<stdio.h>


int main()
{
	FILE* fp = fopen("D:\\文件\\ww.txt","r");
	if (!fp)return -1;
	//char bu[10];
	/*while (fgets(bu, 10, fp) != NULL)
	{
		printf("%s", bu);
	}*/
	int f;
	char a;
	fscanf(fp, "%d", &f);
	fgetc(fp);
	a = fgetc(fp);//这里发现了一个特点就是每次对了的都不会再读了
	if (a == EOF)
	{
		if (feof(fp))printf("end of file\n");
		if (ferror(fp))printf("file acess error\n");

	}
	printf("%d", f);
	

	fclose(fp);
	return 0;
}

这里可以发现读取文本时,在同一个程序里面,自从打开了某个文件,在同一个指针下是会有记录的,也就是说当用fscanf在这个文件里面读取完数字后,这个后面的fgetc是会接着往后读,而不是从头开始读,下面后有一个例子和这个不一样,上面的这个代码就是用来判断读完那个换行之后再读发生错误是什么错误,这里是读完了,里面没有了,如果把上面的代码里面的模式换成w模式,就是第二种读取失败,因为w是只写模式(如果没有该文件夹则创建,如果有,则清空该文件夹),是不可以读取的,就算可以也被清空了,就算清空之后在打印在文件里面,但是只要是w模式就是无法读取;因为我尝试过了;

#include<stdio.h>


int main()
{
	FILE* fp = fopen("D:\\文件\\ww.txt","w");
	if (!fp)return -1;
	//char bu[10];
	/*while (fgets(bu, 10, fp) != NULL)
	{
		printf("%s", bu);
	}*/
	int f;
	char a;
	fprintf(fp, "123456\n");
	fscanf(fp, "%d", &f);

	fgetc(fp);fclose(fp);
	FILE* fpp = fopen("D:\\文件\\ww.txt", "r");
	a = fgetc(fpp);//这里发现了一个特点就是每次对了的都不会再读了
	if (a == EOF)
	{
		if (feof(fpp))printf("end of file\n");
		if (ferror(fpp))printf("file acess error\n");

	}
	printf("%d\n", f);
	printf("%c", a);
    fclose(fpp);
	

	
	return 0;
}

只要关闭了文件再重新打开它并且用另一个新的指针来,它就会要从头开始读取

还有一个函数叫做fgets函数,它的参数有三个一个是读取的字符数组的首地址,还有就是该数组的最大容量,最后一个就是文件类型的指针,原理是这样的,读取成功返回数组首地址,不管是否遇到结尾,只要读取到了数据,就都是返回这个,如果知道结束后都没有读到数据,则返回空指针;读取错误也是返回空指针,这样之前的一段代码就很好说了;(我每次这么做的前提都是在这个文件里面有数据123456,记得每次操作都去看一下)

#include<stdio.h>
int main()
{
	FILE* fp = fopen("D:\\文件\\ww.txt", "r");
	if (!fp)return -1;
	char bu[10];
	while (fgets(bu, 10, fp) != NULL)
	{
		printf("%s", bu);
	}
	fclose(fp);
	return 0;
}

这儿的意思是,每次fgetc-函数读取十个字符,知道读完为止,每读完十个都答应出来。(这里有一个要提醒的是,我们在文件里面读取数据就和在控制踏上读取我们输入的数据是一个性质,所以可以完全按照那个逻辑来);

-------------------------------------------------------------------------------------------------------------------------------------------

 

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

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

相关文章

加强网络风险生命周期

当今业务环境中云原生应用程序的激增帮助组织简化了运营。 企业现在可以近乎实时地监控数据、与客户互动并分享见解&#xff0c;帮助他们克服曾经阻碍生产力的低效率问题。 然而&#xff0c;使用云也极大地扩展了企业可利用的攻击面。 CSPM、CWPP、CNAPP、SAST、SCA、IaC、D…

网络基础3【网络层、数据链路层】

目录 一.网络层 1.IP协议 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;协议头格式 2.网段划分 3.特殊的IP地址 4.IP地址的数量限制 5.私有IP地址和公网IP地址 6.路由 二.数据链路层 1.以太网 2.以太网帧格式 3.MAC地址 4.对比MAC地址和IP地址 …

【图】邻接矩阵

图的存储结构分为邻接矩阵和邻接表两种&#xff0c;带权的图叫做网。 邻接矩阵 邻接矩阵适合边多的图 无向图 两个顶点之间的连线是双向的&#xff0c;一个一维数组存顶点&#xff0c;一个二维数组存边 若有边则值为1&#xff0c;反之为0 邻接矩阵需要知道点数、边数、一个二维…

ARM微处理器的指令集概述

ARM处理器是基于精简指令集计算机&#xff08;RISC&#xff09;原理设计的&#xff0c;指令集和相关译码机制较为简单。ARM微处理器的指令集是加载&#xff08;Load&#xff09;/存储&#xff08;Store&#xff09;型的&#xff0c;也即指令集仅能处理寄存器中的数据&#xff0…

【论文笔记】Attention和Visual Transformer

Attention和Visual Transformer Attention和Transformer为什么需要AttentionAttention机制Multi-head AttentionSelf Multi-head Attention&#xff0c;SMA TransformerVisual Transformer&#xff0c;ViT Attention和Transformer Attention机制在相当早的时间就已经被提出了&…

Word2vec原理+实战学习笔记(二)

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 前篇&#xff1a;Word2vec原理实战学习笔记&#xff08;一&#xff09; 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6 5 对比模型&#xff08;论文Model Architectur…

锐捷(十七)锐捷单臂路由的配置

一 实验拓扑 二 实验需求 用单臂路由实现不同vlan间的通信&#xff0c;即要求vlan10的主机和vlan20的主机之间通过三层实现互访 三 实验分析 路由器的物理接口可以被划分成多个逻辑接口&#xff0c;这些被划分后的逻辑接口被形象的称为子接口。值得注意的是这些逻辑子接口不能…

Redis高级——键值对设计

1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符 例如&#xff1a;我们的登录业务&#xff0c;保存用户信息&a…

AIGC迈向通用人工智能时代

一、AIGC“起飞”的背后 2023年1月30日&#xff0c;AIGC概念股突飞猛涨。一时间&#xff0c;AIGC再次站上风口浪尖。 AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能技术来生成内容&#xff0c;被认为是继UGC、PGC之后的新型内容生产方式&#xff0c;常见…

哈希的应用 -- 布隆过滤器与海量数据处理

文章目录 布隆过滤器概念布隆过滤器设计思路布隆过滤器的应用布隆过滤器模拟实现布隆过滤器的基本框架布隆过滤器的插入布隆过滤器的探测布隆过滤器的删除 布隆过滤器优点布隆过滤器缺陷布隆过滤器模拟实现代码及测试代码海量数据处理哈希切割哈希切分 布隆过滤器概念 布隆过滤…

【机器学习】HOG+SVM实现行人检测

文章目录 一、准备工作1. 下载数据集2. 解压数据集 二、HOG特征简介1. 梯度&#xff08;Gradient&#xff09;2. 格子&#xff08;Cell&#xff09;3. 块归一化&#xff08;Block Normalization&#xff09;4. HOG特征&#xff08;HOG Feature&#xff09;5. 使用skimage.featu…

“五一”假期消防安全知识要牢记之消防安全知识答题活动

“五一”期间&#xff0c;容易出现哪些安全隐患&#xff0c;生产生活中要注意哪些安全事项&#xff0c;一起来看&#xff01; 森林防火&#xff1a; 1.禁止将火柴、汽油等易燃物带入山林&#xff0c;禁止乱扔火种。 2.景区管理单位要加强防火巡逻&#xff0c;禁止野外火源&am…

smbms项目搭建

目录 1.搭建一个maven web项目 2.配置Tomcat 3.测试项目是否能够跑起来 4.导入项目中会遇到的Jar包 5.项目结构搭建 6.项目实体类搭建 7.编写基础公共类 1.数据库配置文件 2.编写数据库的公共类 3.编写字符编码过滤器 3.1web配置注册 4.导入静态资源 1.搭建一个maven web项目 …

C++前置声明的理解

知识补充 在C/C中引入一个头文件时&#xff0c;在编译器预处理的时候会将引入头文件的地方简单替换成头文件的内容。这样做的后果是很容易引起头文件的重复引用。所以我们在编写头文件是一般有以下规定来防止头文件被重复包含。 MyWidget.h #ifndef MyWidget_H_ #define MyWi…

实验四、彩色图像处理

实验目的 使用MatLab软件对图像进行彩色处理&#xff0c;熟悉使用MatLab软件进行图像彩色处理的有关方法&#xff0c;并体会到图像彩色处理技术以及对图像处理的效果。 作业1&#xff1a;生成一副256*256的RGB图像&#xff0c;使得该图像左上角为黄色或者青色&#xff0c;左下…

day04_基本数据类型丶变量丶类型转换

前置知识 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制&#xff0c;是人为定义的带进位的计数方法 。不同的进制可以按照一定的规则进行转换。 进制的分类 十进制&#x…

Seurat -- Perform linear dimensional reduction

brief 什么是线性降维&#xff1f; 这里是一个很形象的网页演示&#xff0c;其中包括了一个视频链接。 这里是如何用R 包psych做线性降维的演示&#xff0c;其中也有原理的简述。 为什么要做线性降维&#xff1f; 因为下一步的聚类分析需要这里的降维结果作为输入。降维做的好…

14-3-进程间通信-消息队列

前面提到的管道pipe和fifo是半双工的&#xff0c;在某些场景不能发挥作用&#xff1b; 接下来描述的是消息队列&#xff08;一种全双工的通信方式&#xff09;&#xff1b; 比如消息队列可以实现两个进程互发消息&#xff08;不像管道&#xff0c;只能1个进程发消息&#xff…

vulnhub靶机Misdirection

环境准备 下载链接&#xff1a;https://download.vulnhub.com/misdirection/Misdirection.zip 解压后双击ovf文件导入虚拟机 网络&#xff1a;DHCP、NAT、192.168.100.0/24网段 信息收集 主机发现 192.168.100.133是新增的ip 端口扫描 发现开放了以上端口&#xff0c;继续…