C++学习48 对ASCII文件的读写操作

如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。

对ASCII文件的读写操作可以用以下两种方法:
1) 用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。“<<”和“ >>”都巳在iostream中被重载为能用于ostream和istream类对象的标准类型的输入输出。由于ifstream和ofstream分别是ostream和istream类的派生类(详情请见:与C++输入输出有关的类和对象),因此它们从ostream和istream类继承了公用的重载函数,所以在对磁盘文件的操作中,可以通过文件流对象和流插入运算符“<<”及流提取运算符“>>”实现对磁盘 文件的读写,如同用cin、cout和<<、>>对标准设备进行读写一样。

2) 用文件流的put、get、geiline等成员函数进行字符的输入输出,前面已介绍,请查看:用C++流成员函数put输出单个字符、C++ get()函数读入一个字符和C++ getline()函数读入一行字符。

[例13.11] 有一个整型数组,含个元素,从键盘输入个整数给数组,将此数组送到磁盘文件中存放。

#include <fstream>
using namespace std;
int main( )
{int a[10];ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件"f1.dat"if(!outfile)                        //如果打开失败,outfile返回值
   {cerr<<"open error!"<<endl;exit(1);}cout<<"enter 10 integer numbers:"<<endl;for(int i=0;i<10;i++){cin>>a[i];outfile<<a[i]<<" ";}            //向磁盘文件"f1.dat"输出数据outfile.close();                   //关闭磁盘文件"f1.dat"return 0;
}

对程序的几点说明:
1) 程序中用#indude命令包含了头文件fstream,这是由于在程序中用到文件流类 ofstream,而ofstream是在头文件fstream中定义的。有人可能会提出:程序中用到cout, 为什么没有包含iostream头文件?这是由于在头文件fstream中包含了头文件iostream, 因此,包含了头文件fstream就意味着已经包含了头文件iostream,不必重复(当然,多写 一行#include <iostream > 也不出错)。

2) 参数 ios::out 可以省写。 如不写此项,则默认为ios::out。下面两种写法等价:
    ofstream outfile("f1.dat", ios::out);
    ofstream outfile("f1.dat");

(3) 系统函数exit用来结束程序运行。exit的参数为任意整数,可用0,1或其他整数。由于用了exit函数,某些老版本的C ++要求包含头文件stdlib.h,而在新版本的C++(如 GCC)则不要求此包含。

4) 在程序中用“cin>>”从键盘逐个读入10个整数,每读入一个就将该数向磁盘文件输出,输出的语句为:
    outfile<<a[i]<<" ";
可以看出,用法和向显示器输出是相似的,只是把标准输出流对象cout换成文件输出流对象outfile而已。由于是向磁盘文件输出,所以在屏幕上看不到输出结果。

请注意:在向磁盘文件输出一个数据后,要输出一个(或几个)空格或换行符,以作为数据间的分隔,否则以后从磁盘文件读数据时,10个整数的数字连成一片无法区分。

[例13.12] 从例13.11建立的数据文件f1.dat中读入个整数放在数组中,找出并输出个数中的最大者和它在数组中的序号。

#include <fstream>
using namespace std;
int main( )
{int a[10],max,i,order;//定义输入文件流对象,以输入方式打开磁盘文件f1.datifstream infile("f1.dat",ios::in|ios::nocreate);if(!infile){cerr<<"open error!"<<endl;exit(1);}for(i=0;i<10;i++){infile>>a[i];  //从磁盘文件读入10个整数,顺序存放在a数组中cout<<a[i]<<" ";  //在显示器上顺序显示10个数
   }         cout<<endl;max=a[0];order=0;for(i=1;i<10;i++)if(a[i]>max){max=a[i];  //将当前最大值放在max中order=i;  //将当前最大值的元素序号放在order中
      }cout<<"max="<<max<<endl<<"order="<<order<<endl;infile.close();return 0;
}

运行情况如下:
1 3 5 2 4 6 10 8 7 9    (在磁盘文件中存放的个数)
max=10    (最大值为)
order=6    (最大值是数组中序号为的元素)

可以看到:文件f1.dat在例13.11中作为输出文件,在例13.12中作为输入文件。 一个磁盘文件可以在一个程序中作为输入文件,而在另一个程序中作为输出文件,在不同 的程序中可以有不同的工作方式。甚至在同一个程序中先后以不同方式打开,如先以输出方式打开,接收从程序输出的数据,然后关闭它,再以输入方式打开,程序可以从中读取数据。

 [例13.13] 从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。再把它从磁盘文件读入程序,将其中的小写字母改为大写字母,再存入磁盘文件f3.dat。

 

#include <fstream>
using namespace std;
// save_to_file函数从键盘读入一行字符,并将其中的字母存入磁盘文件
void save_to_file( )
{ofstream outfile("f2.dat");  //定义输出文件流对象outfile,以输出方式打开磁盘文件f2.datif(!outfile){cerr<<"open f2.dat error!"<<endl;exit(1);}char c[80];cin.getline(c,80);  //从键盘读入一行字符for(int i=0;c[i]!=0;i++)  //对字符逐个处理,直到遇'/0'为止if(c[i]>=65 && c[i]<=90||c[i]>=97 && c[i]<=122)  //如果是字母字符
   {outfile.put(c[i]);  //将字母字符存入磁盘文件f2.datcout<<c[i];  //同时送显示器显示
   }cout<<endl;outfile.close();  //关闭f2.dat
}
//从磁盘文件f2.dat读入字母字符,将其中的小写字母改为大写字母,再存入f3.dat
void get_from_file()
{char ch;//定义输入文件流outfile,以输入方式打开磁盘文件f2.datifstream infile("f2.dat",ios::in|ios::nocreate);if(!infile){cerr<<"open f2.dat error!"<<endl;exit(1);}ofstream outfile("f3.dat");//定义输出文件流outfile,以输出方式打开磁盘文件f3.datif(!outfile){cerr<<"open f3.dat error!"<<endl;exit(1);}while(infile.get(ch))  //当读取字符成功时执行下面的复合语句
   {if(ch>=97 && ch<=122)  //判断ch是否为小写字母ch=ch-32;  //将小写字母变为大写字母outfile.put(ch);  //将该大写字母存入磁盘文件f3.datcout<<ch;  //同时在显示器输出
   }cout<<endl;infile.close();  //关闭磁盘文件f2.datoutfile.close();  //关闭磁盘文件f3.dat
}
int main( )
{save_to_file( );  //调用save_to_file( ),从键盘读入一行字符并将其中的字母存入磁盘文件f2.datget_from_file( );  //调用get_from_file(),从f2.dat读入字母字符,改为大写字母,再存入f3.datreturn 0;
}

本程序用了文件流的put、get、getline等成员函数实现输入和输出,用成员函数inline从键盘读入一行字符,调用函数的形式是cin.inline(c, 80) 在从磁盘文件读一个字符时用infile.get(ch)。可以看到二者的使用方法是一样的, cin和infile都是istream类派生类的对象,它们都可以使用istream类的成员函数。二者的区别只在于:对标准设备显示器输出时用cin,对磁盘文件输出时用文件流对象。

磁盘文件f3.dat的内容虽然是ASCII字符,但人们是不能直接看到的,如果想从显示器上观看磁盘上ASCII文件的内容,可以采用以下两个方法:
1) 在DOS环境下用TYPE命令,如
    D:\\C++>TYPE f3.dat↙(假设当前目录是D:\\C++ )
在显示屏上会输出
    NEWBEIJINGGREATOLYPICCHINA
如果用GCC编译环境,可选择File菜单中的DOS Shell菜单项,即可进入DOS环境。想从DOS返回GCC主窗口,从键盘输入exit即可。

2) 编一程序将磁盘文件内容读入内存,然后输出到显示器。可以编一个专用函数。

#include <fstream>
using namespace std;
void display_file(char *filename)
{ifstream infile(filename,ios::in|ios::nocreate);if(!infile){cerr<<"open error!"<<endl;exit(1);}char ch;while(infile.get(ch))cout.put(ch);cout<<endl;infile.close();
}
// 然后在调用时给出文件名即可
int main( )
{display_file("f3.dat");//将f3.dat的入口地址传给形参filenamereturn 0;
}

运行时输出f3.dat中的字符:
NEWBEIJINGGREATOLYPICCHINA

转载于:https://www.cnblogs.com/Caden-liu8888/p/5840826.html

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

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

相关文章

文献综述写作之“结构内容”

综述&#xff1a; 又称文献综述&#xff0c;英文名为review。它是利用已发表的文献资料为原始素材撰写的&#xff0c;通过对已发表材料的组织、综合和评价&#xff0c;以及对当前研究进展的考察来澄清问题。在某种意义上&#xff0c;综述论文具有一定的指导性&#xff0c;包括以…

NetBeans 7.2 beta:更快,更有用

NetBeans 7.2的beta版本引起了极大的兴奋。 在本文中&#xff0c;我将简要介绍一下此版本令人兴奋的原因&#xff08;包括更好的性能&#xff0c;提供更多的提示以及集成FindBugs&#xff09;。 NetBeans 7.2 beta在典型的下载捆绑软件中可用&#xff0c;从较小的Java SE&#…

地铁闸门会夹伤人吗_家长们注意啦!又有孩子被地铁闸机夹翻

原标题&#xff1a;家长们注意啦&#xff01;又有孩子被地铁闸机夹翻现代快报讯(通讯员狄公宣记者顾元森)家长带着孩子通过地铁站闸机&#xff0c;这件事情看似简单&#xff0c;却隐藏着风险。近日&#xff0c;南京地铁又发生了一起儿童被闸机夹翻的事&#xff0c;所幸孩子并无…

WPF DevExpress 设置雷达图Radar样式

DevExpress中定义的ChartControl很不错&#xff0c;很多项目直接使用这种控件。 本节讲述雷达图的样式设置 <Grid><Grid.Resources><DataTemplate x:Key"LabelItemDataTemplate" DataType"dxc:SeriesLabelItem"><Border CornerRadius…

mxnet系列教程之1-第一个例子

第一个例子当然是mnist的例子 假设已经成功安装了mxnet 例子的代码如下&#xff1a; cd mxnet/example/image-classification python train_mnist.py这样就会运行下去 train_mnist.py的代码为 """ Train mnist, see more explanation at http://mxnet.io/tutori…

Apache Shiro第3部分–密码学

除了保护网页和管理访问权限外&#xff0c; Apache Shiro还执行基本的加密任务。 该框架能够&#xff1a; 加密和解密数据&#xff0c; 哈希数据&#xff0c; 生成随机数。 Shiro没有实现任何加密算法。 所有计算都委托给Java密码学扩展&#xff08;JCE&#xff09;API。 使…

mysql数据存在就更新_Mysql:如果数据存在则更新,不存在则插入

mysql语法支持如果数据存在则更新&#xff0c;不存在则插入&#xff0c;首先判断数据存在还是不存在的那个字段要设置成unique索引&#xff0c;例如表tb_addrbook如下&#xff1a;索引&#xff1a;语句1:不存在插入INSERT INTO tb_addrbook(num,name,mobile) VALUE(1001,小李,1…

Memcached, Redis, MongoDB区别

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库&#xff0c;其优势在于查询功能比较强大&#xff0c;能存储海量数据。mongodb和memcached不存在谁替换谁的问题。和memcached更为接近的是redis。它们都是内存型数据库&#xff0c;数据保存在内存中&…

洛谷P1757 通天之分组背包 [2017年4月计划 动态规划06]

P1757 通天之分组背包 题目背景 直达通天路小A历险记第二篇 题目描述 自01背包问世之后&#xff0c;小A对此深感兴趣。一天&#xff0c;小A去远游&#xff0c;却发现他的背包不同于01背包&#xff0c;他的物品大致可分为k组&#xff0c;每组中的物品相互冲突&#xff0c;现在&a…

c3p0 0.9.1.2 配套mysql_连接数据库,使用c3p0技术连接MySQL数据库

读取配置文件连接MySQL数据库先确认已经导入了 mysql 的驱动包db.propertiesdrivercom.mysql.jdbc.Driverurljdbc:mysql://localhost:3306/v20?useUnicodetrue&characterEncodingutf8usernamerootpassword123456JdbcUtil.javapackage com.stu_mvc.utils;import java.io.Fi…

【Hadoop】Hadoop MR 自定义分组 Partition机制

1、概念 2、Hadoop默认分组机制--所有的Key分到一个组&#xff0c;一个Reduce任务处理 3、代码示例 FlowBean package com.ares.hadoop.mr.flowgroup;import java.io.DataInput; import java.io.DataOutput; import java.io.IOException;import org.apache.hadoop.io.WritableC…

Spring Framework 3.2 M1发布

SpringSource刚刚宣布了针对Spring 3.2的第一个里程碑版本。 现在可以从SpringSource存储库&#xff08;位于http://repo.springsource.org/&#xff09;获得新版本。 查看有关通过Maven 解决这些工件的快速教程 。 此版本包括&#xff1a; 最初支持异步Controller方法 早期…

两种动态SQL

参考&#xff1a;http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.htmlhttp://www.cnblogs.com/xbf321/archive/2008/11/02/1325067.html 两种动态SQL  1. EXEC (sql)   2. EXEC sp_executesql 性能&#xff1a;sp_executesql提供了输入输出接口&#xff0c;更…

mysql查询含有某个值的表_MYSQL查询数据表中某个字段包含某个数值

当某个字段中字符串是"1,2,3,4,5,6"或者"123456" 查询数据表中某个字段是否包含某个值 1:模糊查询 使用like select * from 表 where 字段 like %1%; 2:函数查找 find_in_set(str,数组) select * from 表 where find_in_set(1,字段); 注意:mysql字符串…

android学习笔记35——AnimationDrawable资源

AnimationDrawable资源 AnimationDrawable&#xff0c;代表一个动画。 android既支持传统的逐帧动画(类似于电影方式&#xff0c;一张图片一张图片的切换)&#xff0c;也支持通过平移、变换计算出来的补间动画、属性动画。 下面以补间动画为例&#xff0c;介绍如何定义Animatio…

RESTEasy教程第2部分:Spring集成

RESTEasy提供了对Spring集成的支持&#xff0c;这使我们能够将Spring bean作为RESTful WebServices公开。 步骤&#xff03;1&#xff1a;使用Maven配置RESTEasy Spring依赖项。 <project xmlnshttp:maven.apache.orgPOM4.0.0 xmlns:xsihttp:www.w3.org2001XMLSchema-insta…

java RSA 加签验签【转】

引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.core.service.impl.alipay;import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PK…

mysql启动时执行sql server_常见 mysql 启动、运行.sql 文件错误处理

1、mysql 启动错误处理查看 log&#xff1a;Mac: /usr/local/var/mysql/lizhendeMacBook-Pro.local.err根据 log 针对性的进行调整&#xff0c;包治百病2、Mysql Incorrect datetime value问题描述&#xff1a;低版本的 mysql 中&#xff0c;数据库转储 sql 文件。导入到高版本…

带有谓词的Java中的函数样式-第2部分

在本文的第一部分中&#xff0c;我们介绍了谓词&#xff0c;这些谓词通过具有返回true或false的单个方法的简单接口&#xff0c;为Java等面向对象的语言带来了函数式编程的某些好处。 在第二部分和最后一部分中&#xff0c;我们将介绍一些更高级的概念&#xff0c;以使您的谓词…

Devxtreme 显示Master-Detail数据列表, 数据显示颜色

1 ////刷新3/4簇Grid2 //function GetClusterGrid(id, coverageId, clusterId) {3 4 // var region getRegionCityName();5 // $.ajax({6 // type: "POST",7 // url: "fast_index_overview.aspx/GetClusterGrid&q…