文件操作--按字符读写文件

news2024/11/22 16:55:05

目录

1、读写文件中的字符:

例题1:从键盘键入一串字符,然后把它们转存到磁盘文件上。

例题2:将0-127之间的ASCII字符写到文件中,然后从文件中读出并显示到屏幕上。

例题3:修改例题2判断读出的字符是否为可打印字符,若是则直接将该字符显示到屏幕上,否则将该字符的十进制ASCII码显示到屏幕上。

2、读写文件中的字符串

例题4:用函数fgets(),从键盘键入一串字符,然后把它们添加到文本文件demo.txt的末尾。假设文本文件demo.txt中已有内容为:I am a student.


ANSI C提供了丰富的文件读写函数。包含按字符读写、按数据块读写、按格式读写等。

1、读写文件中的字符:

        函数fgetc()用于从一个以只读或读写方式打开的文件上读字符。其函数原型为:

        int  fgetc(FILE *fp);

其中,fp是由函数fopen()返回的文件指针,该函数的功能是从fp所指定的文件中读取一个字符,并将位置指针指向下一个字符。若读取成功,则返回该字符,若读到文件末尾,则返回EOF,(EOF是一个字符常量,在stdio.h中定义为-1)。

        函数fputc()用于将一个字符写到一个文件上。fputc()的函数原型为:

        int fputc(int c,FILE  *fp);

其中,fp是由函数fopen()返回的文件指针,c是要输入的字符(尽管c定义为int型,但值写入低字节)。该函数的功能是将字符c写到文件指针fp所指的文件中。若写入错误,则返回EOF,否则返回字符c。

例题1:从键盘键入一串字符,然后把它们转存到磁盘文件上。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	FILE *fp;
	char ch;
	if((fp = fopen("demo.txt","w"))==NULL)
	{
		printf("Filure to open demo.txt!\n");
		exit(0);
	}
	ch = getchar();
	while(ch!='\n')
	{
		fputc(ch,fp);
		ch= getchar();
	}
	fclose(fp);
	return 0;
}

 

他会自动生成一个文件叫做demo.txt并自动输入我在exe中输入的字符串。

例题2:将0-127之间的ASCII字符写到文件中,然后从文件中读出并显示到屏幕上。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	FILE *fp;
	char ch;
	int i;
	if((fp = fopen("demo.bin","wb"))==NULL)
	{
		printf("Failure to open demo.bin!\n");
		exit(0);
	}
	for(i=0;i<128;i++)
	{
		fputc(i,fp);
	}
	fclose(fp);
	if((fp = fopen("demo.bin","rb"))==NULL)
	{
		printf("Failure to open demo.bin!\n");
		exit(0);		
	}
	while((ch=fgetc(fp))!=EOF)
	{
		putchar(ch);
	}
	fclose(fp);
	return 0;
}

运行该程序显示的结果在不同的机器上可能显示的乱码有所不同,用记事本或写字板打开的文件看到的也是乱码,而且与屏幕显示的结果可能并不完全一致。

这是为什么呢?

这是因为在Windows文本编辑器中打开文件时,显示的那些拐来拐去、方块箭头等符号都是不可打印字符。使用不同的文本编辑软件会有不同的处理,而且还会配合字符集等进行转码,甚至换用不同的字体是会有不同的显示结果。

程序第23~26行通过检查fgetc()的返回值是否为EOF来判断是否读到了文件的末尾,若读到文件末尾,则返回EOF,即-1。除此方法之外,还可以使用函数feof()来判断是否读到文件末尾。

因此程序第23~26行还可用下面的语句替换:

ch = fgetc(fp);

while(!feof(fp))

{

        putchar(ch);

        ch = fgetc(fp);

这里,函数feof()用于检查是否到达文件末尾,当文件位置指针指向文件结束符(End-of-file Indicator)时,返回非0值,否则返回0值。其函数原型为:

int  feof(FILE *fp);

例题3:修改例题2判断读出的字符是否为可打印字符,若是则直接将该字符显示到屏幕上,否则将该字符的十进制ASCII码显示到屏幕上。

 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
	FILE *fp;
	char ch;
	int i;
	if((fp = fopen("demo.bin","wb"))==NULL)
	{
		printf("Failure to open demo.bin!\n");
		exit(0);
	}
	for(i=0;i<128;i++)
	{
		fputc(i,fp);
	}
	fclose(fp);
	if((fp= fopen("demo.bin","rb"))==NULL)
	{
		printf("Failure to open demo.bin!\n");
		exit(0);
	}
	while((ch= fgetc(fp))!=EOF)  //从文件中读取字符直到文件末尾 
	{
		if(isprint(ch))				//判断字符是否可打印 
			printf("%c\t",ch);		//若是可打印字符,则显示该字符 
		else
			printf("%d\t",ch);      //若是非可打印字符,则显示该字符的ASCII码值 
	} 
	fclose(fp);
	return 0;
}

除本例使用的方法外,还可使用函数feof()来判断是否读到文件末尾,即将原程序第24~30行换成如下语句:

while(!feop(fp))

{

        ch = fgetc(fp);

        if(isprint(ch))

                printf("%c\t",ch);

        else

                printf("%d\t",ch);

此时程序运行显示结果后会显示一个-1,这是因为使用函数feof()时,仅当读到文件结束符时,才能判断出到达文件尾,而文件末尾的文件结束符又是一个值为-1、不可打印的非控制字符,因此按上面程序的流程,就将其十进制ASCII码值(即-1)输出到屏幕上。

如何解决这个问题呢?

其实很简单就是将上面第27行用函数isprint()判断是否时可打印字符的语句修改为用函数iscntrl()判断是否是控制字符即可,即修改为   if(!iscntrl(ch))

若为非控制字符,则直接将其显示到屏幕上,否则将其十进制ASCII码值显示到屏幕上。 

 

修改方法2:将第 26行语句复制到第30行和第31行之间作为while循环的最后一条语句,同时复制到第24行while语句之前,然后删除第26行。之所以这样修改,是因为函数feof()总是在读完文件所有内容后在执行一次读文件操作(将文件结束符读走,但不显示)才能返回真(非0)值。

2、读写文件中的字符串

从文件中读取字符串可使用函数fgets(),其函数原型为:

char * fgets(char * s,int n, FILE *fp);

该函数从fp所指的文件中读取字符串并在字符末尾添加'\0',然后存入s,最多读n-1个字符。当读到回车换行符、到达文件尾或读满n-1个字符时,函数返回该字符串的首地址,即指针s的值;读取失败时返回空指针(NULL)。因出错和到达文件尾时都返回NULL,因此应使用feof()或ferror()确定函数fgets()返回NULL的实际原因是什么。

例题4:用函数fgets(),从键盘键入一串字符,然后把它们添加到文本文件demo.txt的末尾。假设文本文件demo.txt中已有内容为:I am a student.

#include <stdio.h>
#include <stdlib.h>
#define N 80
int main(void)
{
	FILE *fp;
	char str[N];
	if((fp= fopen("demo.txt","a"))==NULL)
	{
		printf("Failure to open demo.txt!\n");
		exit(0);
	}
	gets(str);
	fputs(str,fp);
	fclose(fp);
	if((fp = fopen("demo.txt","r"))==NULL)
	{
		printf("Failure to open demo.txt!\n");
		exit(0);
	}
	fgets(str,N,fp);
	puts(str);
	fclose(fp);
	return 0;
}

与gets()不同的是,fgets()从指定的流读字符串,读到换行符时将换行符也作为字符串的一部分读到字符串中来。同理,与puts不同的是,fputs()不会再写入文件的字符串末尾添加换行符。 

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

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

相关文章

【NeRF】相机的内外参是什么?单目相机是如何成像的?

文章目录 【NeRF】相机的内外参是什么&#xff1f;单目相机是如何成像的&#xff1f;1.相机外参2.相机内参 【NeRF】相机的内外参是什么&#xff1f;单目相机是如何成像的&#xff1f; 在做Nerf时对其中的一些原理感到困惑&#xff0c;因而把这些基础理论知识总结下来&#xff…

b站网页版视频投稿接口分析

b站网页版视频投稿接口分析 上传视频逻辑如下&#xff1a;1.预加载2.获取准备上传到服务器的数据3.分片上传&#xff08;块大小最大为10MB/10485760字节&#xff09;4.上传完成进行合片 上传封面逻辑如下&#xff1a;投稿视频&#xff1a; B站投稿视频&#xff08;手稿&#xf…

【深度学习】:用于 GAN 的生成器架构 - 生成人脸

一、说明 生成对抗网络(GAN)是机器学习中一个相对较新的概念,于2014年首次推出。他们的目标是合成与真实图像无法区分的人工样本,例如图像。GAN 应用程序的一个常见示例是通过从名人人脸数据集中学习来生成人工人脸图像。虽然GAN图像随着时间的推移变得更加逼真,但它们的主…

短视频seo矩阵源码私有化部署方案

目录 前 言 一。 短视频seo矩阵算法 二、 短视频seo源码功能构建 三、 短视频seo私有化部署流程解读 前 言 为了更好地提高短视频平台的SEO优化效果&#xff0c;许多企业开始尝试私有化部署方案。这样做的好处在于&#xff0c;企业可以根据自身的特点和需求来灵活调整矩阵源…

龙蜥开发者说:参与开源要敢于担任不同角色 | 第 21 期

「龙蜥开发者说」第 21 期来了&#xff01;开发者与开源社区相辅相成&#xff0c;相互成就&#xff0c;这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的&#xff0c;我们希望在这里让更多人看见技术的力量。本期故事&#xff0c;我们邀请了龙蜥社区开发者支智…

教你纯小白选对Java路线

许多人问如何开启JAVA的入门这里有两个层次: 首先&#xff0c;你是一个局外人。你一天只用电脑一两个小时&#xff0c;玩游戏&#xff0c;其他什么都不知道。你听说JAVA很受欢迎&#xff0c;而且薪水很高&#xff0c;你想要开始学习如何入门。 这个入门&#xff0c;就是进入编程…

关于Apache-Commons-Lang3中元组的使用

关于Apache-Commons-Lang3中元组的使用 在日常工作中&#xff0c;有时候我们并不清楚有这些工具类的存在&#xff0c;造成在开发过程中重新实现导致时间浪费&#xff0c;且开发的代码质量不佳。而 apache 其实已经提供了系列的工具包给我们使用&#xff0c;只是大多数人&#x…

通过列排斥能比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构中有6个1, 行分布是0&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;2列分布是2&#xff0c;2&#xff0c;2.统计迭代次…

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图) 目录 回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 回归预测 | MATLAB实现ELM极限学习机多输入单输出回…

由于找不到d3dx9_43.dll,有什么可靠的修复方法?

由于找不到d3dx9_43.dll&#xff0c;无法继续执行代码&#xff0c;这种情况大家是否有遇见过&#xff1f;其实就算没遇到过&#xff0c;大家应该也有遇到别的dll文件丢失吧&#xff1f;道理都一样&#xff0c;都是dll文件丢失&#xff0c;我们只需要把它给修复就可以了&#xf…

第一阶段-第五章 Python的函数

目录 一、函数的介绍  1.学习目标  2. 什么是函数  3.本节的演示  4.为什么要学习、使用函数  5.本小节的总结 二、函数的定义  1.学习目标  2.函数的语法  3.本节的代码演示  4.本小节的总结  5.练习案例&#xff1a;自动查核酸 三、函数的参数  1.学习…

Mac 查看端口和关闭进程

经常使用 node 启动本地&#xff0c;有时一不小心按了 Ctrl Z &#xff08;Command Z&#xff09;把服务关闭了&#xff0c;但实际上没真正关闭该服务&#xff0c;再次启动服务很可能会提示端口号被占用。 系统环境&#xff1a;Mac 查看端口的详细端口占用情况 命令&#xf…

Scrapy爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面&#xff0c;特别是vue与react的普及&#xff0c;使用scrapy框架定位动态网页元素十分困难&#xff0c;而selenium是最流行的浏览器自动化工具&#xff0c;可以模拟浏览器来操作网页&#xff0c;解…

【PCIE】Device Control Register (Offset 08h)

Maximum Payload Size “Maximum Payload Size” &#xff08;最大传输负载大小&#xff09;是PCI Express设备控制寄存器中的一个位域&#xff0c;用于设置设备支持的最大传输负载的大小。 PCI Express使用数据包&#xff08;Packet&#xff09;来传输数据&#xff0c;而数据…

2024考研408-操作系统 第二章-进程与线程 学习笔记

文章目录 前言一、进程1.1、进程的概念、组成与特征1.1.1、进程的概念1.1.2、进程的组成认识PCB认识程序段与数据段&#xff08;包含进程实体概念&#xff09; 1.1.3、进程的特征知识回顾与重要考点 1.2、进程的状态、状态间的转换和组织方式1.2.1、进程的状态进程的五种状态详…

微信扫码跳转小程序实现web登录

前面博客我有写微信扫码跳转h5实现登录&#xff0c;但是需要申请服务号 最近项目迭代&#xff0c;想到小程序能做扫码登录的话&#xff0c;web网页端和小程序同时登录账户不是更好吗&#xff0c;还不用额外申请服务号 第一步 打开微信公众平台&#xff0c;在“开发”菜单下点击…

springcloud笔记二

配置管理服务是共有的&#xff0c;结合微服务自身的配置。这样核心配置更改就无需逐个更改 配置管理: 首先新建一个配置管理 Data ID为配置文件的名称 一般为项目名称-项目环境yaml&#xff0c;如userservice-dev.yaml 编写配置内容&#xff0c;发布 获取nacos配置信息: 可能…

数据透视表:pivot_table()--Pandas

1. 函数功能 创建数据透视表&#xff0c;返回一个EXCEL形式的数据透视表。 2. 函数语法 DataFrame.pivot_table(valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)3. 函数参数 参数…

Vue3 父子组件之间传值

Vue3TSVite环境开发 1.父组件给子组件传递方法&#xff0c;属性和值 父组件引入子组件处里面绑定方法 showBtn &#xff0c;属性name和值msg 子组件通过defineProps()来接收 子组件页面显示父组件的方法 showBtn &#xff0c;属性name和值msg 2.父组件接收子组件传递的…

ModaHub魔搭社区:向量数据库Zilliz Cloud的AUTOINDEX教程

目录 创建索引和向量搜索 总结 为满足用户不同需求,Zilliz Cloud 提供 3 种类型的集群 CU——性能型、容量型和经济型。但是,为不同类型 CU 集群中的 Collection 创建索引时,通常需要根据所选择的 CU 类型调整索引参数。为了方便您创建索引,免去调节参数的麻烦,Zilliz C…