IO相关2(文件输入输出)
除了继承自 iostream 类型的行为之外,fstream 中定义的类型还增加了一些新的成员来管理与流相关的文件。我们可以对 fstream,ifstream 和 ofstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作:
fstream fstrm;//创建一个未绑定的文件流.fstream是头文件fstream中定义的一个类型
fstream fstrm1(s);//创建一个fstream,并打开名未s的文件.s可以是string类型或者是一个指向c风格字符串的指针.这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
fstream fstrm2(s, mode);//与前一个构造函数类似,但指定mode打开文件
fstrm.open(s);//打开名为s的文件,并将文件与fstrm绑定.s可以是一个string或一个指向c风格字符串的指针.默认的文件mode依赖于fstream的类型.返回void
fstrm.close();//关闭fstrm绑定的文件.返回void
fstrm.is_open();//返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
使用文件流对象:
ifstream in(ifile);//构造一个ifstram并打开给定文件
ofstream out;//输出文件流未关联到任何文件
#include <iostream>
#include <fstream>
using namespace std; char const *filename = "D:\\code\\c++\\ac27.text"; string str; int main(void){
ofstream file(filename);
if(!file) return ;
file << "hello world!" << endl;
file.close(); ifstream out;
out.open(filename);
while(out >> str){
cout << str << endl;
}
out.close();
return ;
}
用 fstream 代替 iostream&
在要求使用基类对象的地方,我们可以用继承类型的对象来替代。因此,如果一个函数接受一个 ostream& 参数,我们在调用这个函数时,可以传递给他一个 ofstream 对象,对 istream& 和 ifstream 也是类似的:
#include "Sales_data.h"
#include <iostream>
#include <fstream>
using namespace std; int main(int argc, char const *argv[]){
ifstream input(argv[]);
ofstream output(argv[]);
Sales_data total;
if(read(input, total)){
Sales_data trans;
while(read(input, trans)){
if(total.isbn() == trans.isbn()) total += trans;
else{
print(output, total) << endl;
total = trans;
}
}
print(output, total) << endl;
}else cerr << "NO data?" << endl;
return ;
}
read 和 print 两个函数定义时指定的形参分别时 istream& 和 ostream&,但我们可以传递 fstream 对象。
自动构造和析构:
考虑这样一个程序,它的 main 函数接受一个要处理的文件列表:
#include <iostream>
#include <fstream>
using namespace std; const string gel("D:\\code\\c++\\"); void process(ifstream &input){
string str;
input >> str;
cout << str << endl;
} int main(int argc, char const *argv[]){
for(int i = ; i < argc; i++){
const string filename = (char)(i - + 'a') + (string)".txt";
// cout << filename << endl;
ofstream output(gel + filename);
output << filename << endl;
// output.close();//fstream对象离开其作用域时,与之联系的文件自动关闭(close会自动调用)
} //对每个传递给程序的文件执行循环操作
for(auto p = argv + ; p != argv + argc; ++p){
ifstream input(*p);//创建输出流并打开文件
if(input) process(input);
else cerr << "couldn't open: " + string(*p) << endl;
// input.close();
}
return ;
}
因为 output 和 input 是局部变量,它在每个循环步中都要创建和销毁一次。当一个 fstream 对象离开其作用域时,与之对应的文件会自动关闭。在下一步循环中,它们会再次被创建。当一个 fstream 对象被销毁时,close 会自动调用。
文件模式:
每个流都有一个关联的文件模式,用来指出如何使用文件:
in 以读方式打开
out 以写方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO
指定文件模式有如下限制:
1.只可以对 ofstream 或 fstream 对象设定 out 模式。
2.只可以对 ifstream 或 fstream 对象设定 in 模式。
3.只有当 out 也被设定时才可以设定 trunc 模式。
4.只要 trunc 没被设定,就可以设定 app 模式。在 app 模式下,即使没有显示指定 out 模式,文件也总是以输出方式被打开。
5.默认情况下,即使我们没有指定 trunc,以 out 模式打开的文件也会被截断。为了保留以 out 模式打开的文件内容,我们必须同时指定 app 模式,这样才会以追加的模式写到文件末尾:或者同时指定 in 模式,即打开文件同时进行读写操作。
6.ate 和 binaty 模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用此默认模式。ifsream 关联的文件默认以 in 模式打开,ofstream 关联的文件默认以 out 模式打开,fstream 关联的文件默认以 in 和 out 模式打开。
对流的操作:
对输入流操作:seekg()与tellg()
对输出流操作:seekp()与tellp()
下面以输入流函数为例介绍用法:
seekg() 是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。
对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:
ios::beg:表示输入流的开始位置
ios::cur:表示输入流的当前位置
ios::end:表示输入流的结束位置
tellg() 函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。
#include <iostream>
#include <fstream>
using namespace std; const char *filename = "D:\\code\\c++\\ac27.text";//该文件中存储了abcd四个字符 int main(void){
long l, m;
ifstream in(filename, ios::in | ios::binary | ios::ate);//加了ate参数,此时get指针在文件末尾('\0')的下一个位置
l = in.tellg();
in.seekg(, ios::end);//将get指针移动到文件末尾下一个位置
m = in.tellg();//得到get指针当前的位置
in.close();
cout << l << endl;//输出6
cout << "size of " << filename;
cout << " is " << (m - ) << " byset.\n";//m-1为5
return ;
}
对于输出流操作:seekp()与tellp()用法是一样的。
IO相关2(文件输入输出)的更多相关文章
- IO库----IO类,文件输入输出,string流
一.IO类 1.IO库类型和头文件表: 头文件 类型 iostream istream,wistream 从流读取数据 ostream,wostream 向流写入数据 iostream,wiostre ...
- 什么是IO流 \ 以及文件输入输出
一.IO流的分类: 流按照操作数据的类型分为两种:字节流:字符流. 1.什么是字节流:读取的是文件的二进制数据,不会对二进制做处理,不会解析成看得懂的数据. 2.什么是字符流:读取的是文件的二进制数据 ...
- C++IO类&文件输入输出
C++IO类&文件输入输出 istream(输入流)类型,提供输入操作. ostream(输出流)类型,提供输出操作. cin,一个istream对象,从标准输入读取数据. cout,一个os ...
- 文件IO 相关的包:java.io文件——API
文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- 161228、Java IO流读写文件的几个注意点
平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? ...
- 161108、Java IO流读写文件的几个注意点
平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? ...
- python 中文件输入输出及os模块对文件系统的操作
整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作. 文件输入输出 1.内建函数open(file_name,文件打开模式,通用换行符支持),打开文件返回文件对象. 2. ...
- 第五次程序设计作业 C++计算器雏形 调用文件输入输出
一.C++计算器作业系列链接 第三次作业:C++计算器雏形 第三次作业附加:代码规范 第四次作业:命令行的调用及计算 MyGithub 二.本次作业相关 要求:第五次程序设计作业 根据这一次的作业要求 ...
随机推荐
- 本人编写的一份前端vue面试题
说明,此题目本人自出,做过本人所在公司的前端面试题,在此共享给大家 1. 如何在vue组件中实现v-model的功能?(只需给出关键代码) 2. 简述你知道的生命周期函数和执行时机 3. 谈谈你对计算 ...
- C#应用调试C++ dll的方法
最近碰到个C#应用闪退的问题,由于通讯部分调用了C++工程写的dll,下面介绍一种调试的方法. 右键 启动项目,分别配置常规和和调试即可,如下图. 常规中,输出目录设置为安装目录中dll对应的目录: ...
- linux的学习在runoob.com网站
学习位置: Shell 变量
- Android 学习 - Telnet 控制AVD
启动Android Virtual Device之后,使用telnet,可以方便地控制AVD. 首先,获取端口号.启动AVD后,在标题栏上方会出现端口号:设备名,在下面的截图中为5554:N4-15- ...
- MYCAT实战之分片迁移
实践扩容 1.要求: travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上, 并完成记录要求,最快的数据迁移做法,中断业务时间最短 2.针对分片以及迁 ...
- 虚拟机之 搭建discuz论坛
1.下载 mkdir /data/www cd !$ wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip 2.解压 ...
- 解决Axis2在webservice中遇到特殊字符的无法传输的缺陷(<CDATA>数据类型)
在使用Axis2进行soa webservice开发时,遇到类似以下的错误信息: com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStream ...
- SkyBox
[SkyBox] Skyboxes 本质是一个Material,这个Meterial的shader必须设置为ShaderFX/Skybox. SkyBox可以被绑定到摄像机或设置一个全局的SkyBox ...
- SolrCloud中的文件与Collection管理
转载请出自出处:http://eksliang.iteye.com/blog/2124078 http://eksliang.iteye.com/ 一.内嵌启动SolrCloud时端口默认分配 当 S ...
- Leetcode:Container With Most Water分析和实现
题目大意是提供n个非负整数,a1,...,an,可以将其理解为多个边界(垂直的线段),其中ai处于x坐标i处,并且ai代表的线段高度即为ai的值.要求我们取这样的i与j,使得ai与aj以及x坐标轴围成 ...