IO相关2(文件输入输出)

除了继承自 iostream 类型的行为之外,fstream 中定义的类型还增加了一些新的成员来管理与流相关的文件。我们可以对 fstream,ifstream 和 ofstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作:

1     fstream fstrm;//创建一个未绑定的文件流.fstream是头文件fstream中定义的一个类型
2     fstream fstrm1(s);//创建一个fstream,并打开名未s的文件.s可以是string类型或者是一个指向c风格字符串的指针.这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
3     fstream fstrm2(s, mode);//与前一个构造函数类似,但指定mode打开文件
4     fstrm.open(s);//打开名为s的文件,并将文件与fstrm绑定.s可以是一个string或一个指向c风格字符串的指针.默认的文件mode依赖于fstream的类型.返回void
5     fstrm.close();//关闭fstrm绑定的文件.返回void
6     fstrm.is_open();//返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

使用文件流对象:

ifstream in(ifile);//构造一个ifstram并打开给定文件
ofstream out;//输出文件流未关联到任何文件

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4
 5 char const *filename = "D:\\code\\c++\\ac27.text";
 6
 7 string str;
 8
 9 int main(void){
10     ofstream file(filename);
11     if(!file) return 0;
12     file << "hello world!" << endl;
13     file.close();
14
15     ifstream out;
16     out.open(filename);
17     while(out >> str){
18         cout << str << endl;
19     }
20     out.close();
21     return 0;
22 }

用 fstream 代替 iostream&

在要求使用基类对象的地方,我们可以用继承类型的对象来替代。因此,如果一个函数接受一个 ostream& 参数,我们在调用这个函数时,可以传递给他一个 ofstream 对象,对 istream& 和 ifstream 也是类似的:

 1 #include "Sales_data.h"
 2 #include <iostream>
 3 #include <fstream>
 4 using namespace std;
 5
 6 int main(int argc, char const *argv[]){
 7     ifstream input(argv[1]);
 8     ofstream output(argv[2]);
 9     Sales_data total;
10     if(read(input, total)){
11         Sales_data trans;
12         while(read(input, trans)){
13             if(total.isbn() == trans.isbn()) total += trans;
14             else{
15                 print(output, total) << endl;
16                 total = trans;
17             }
18         }
19         print(output, total) << endl;
20     }else cerr << "NO data?" << endl;
21     return 0;
22 }

read 和 print 两个函数定义时指定的形参分别时 istream& 和 ostream&,但我们可以传递 fstream 对象。

自动构造和析构:

考虑这样一个程序,它的 main 函数接受一个要处理的文件列表:

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4
 5 const string gel("D:\\code\\c++\\");
 6
 7 void process(ifstream &input){
 8     string str;
 9     input >> str;
10     cout << str << endl;
11 }
12
13 int main(int argc, char const *argv[]){
14     for(int i = 1; i < argc; i++){
15         const string filename = (char)(i - 1 + ‘a‘) + (string)".txt";
16         // cout << filename << endl;
17         ofstream output(gel + filename);
18         output << filename << endl;
19         // output.close();//fstream对象离开其作用域时,与之联系的文件自动关闭(close会自动调用)
20     }
21
22     //对每个传递给程序的文件执行循环操作
23     for(auto p = argv + 1; p != argv + argc; ++p){
24         ifstream input(*p);//创建输出流并打开文件
25         if(input) process(input);
26         else cerr << "couldn‘t open: " + string(*p) << endl;
27         // input.close();
28     }
29     return 0;
30 }

因为 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() 函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4
 5 const char *filename = "D:\\code\\c++\\ac27.text";//该文件中存储了abcd四个字符
 6
 7 int main(void){
 8     long l, m;
 9     ifstream in(filename, ios::in | ios::binary | ios::ate);//加了ate参数,此时get指针在文件末尾(‘\0‘)的下一个位置
10     l = in.tellg();
11     in.seekg(0, ios::end);//将get指针移动到文件末尾下一个位置
12     m = in.tellg();//得到get指针当前的位置
13     in.close();
14     cout << l << endl;//输出6
15     cout << "size of " << filename;
16     cout << " is " << (m - 1) << " byset.\n";//m-1为5
17     return 0;
18 }

对于输出流操作:seekp()与tellp()用法是一样的。

原文地址:https://www.cnblogs.com/geloutingyu/p/8269485.html

时间: 2024-10-18 12:03:00

IO相关2(文件输入输出)的相关文章

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

Java IO流读写文件的几个注意点

平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? 解决这个问题之后,总结了几个注意点. 注意点一:Reader/Writer读写二进制文件是有问题的 : public void copyFile1() { File srcFile = new File("E://atest//atest.txt"); File dstFile = ne

Python文件输入输出

http://blog.csdn.net/pipisorry/article/details/37769669python文件输入输出教程 python文件中的读入科学计数法的数字 float(word_dist) 皮皮blog python文件读取 内置函数open() 得到一个文件对象(file object):open(filename, mode='r') 函数参数 1. 模式mode: 模式 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式

【转】acm技巧 使用文件输入输出方便测试的方法

Felix大牛给了一种更简单使用文件输入输出的改进方法,在ACM中应用很广,而且超赞,现在来介绍一下. 这次用到的文件打开函数不再是fopen,而是stdio.h中包含的另一个函数freopen FILE * freopen ( const char * filename, const char * mode, FILE * stream ); [参数说明] filename: 要打开的文件名 mode: 文件打开的模式,和fopen中的模式(r/w)相同 stream: 文件指针,通常使用标准

【足迹C++primer】22、文件输入输出

文件输入输出 使用文件流对象 创建文件流对象时,我们可以提供文件名(可选).如果提供了一个文件名,则open会自动被调用: ifstream in(ifile); //构造一个ifstream并打开给定文件 ofstream out; //输出文件流未关联到任何文件 用fstream代替iostream& 首先这里有一个头文件和一个定义的文件要使用 Sales_data.h #ifndef SALES_DATA_H_INCLUDED #define SALES_DATA_H_INCLUDED #

191108、Java IO流读写文件的几个注意点

平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? 解决这个问题之后,总结了几个注意点. 注意点一:Reader/Writer读写二进制文件是有问题的 : 上面代码使用BufferedReader一行一行地读取一个文件,然后使用BufferedWriter把读取到的数据写到另外一个文件中.如果文件是ASCCII形式的,则内容还是能够正确读取的.但如

c++ IO类,文件操作

c++ IO类主要分三种 博文参考:http://www.cnblogs.com/yxnchinahlj/archive/2011/02/12/1952546.html 输入:从设备(文件)-->缓冲区-->内存 输出:内存-->缓冲区-->设备(文件) 1.对应标准输入输出(控制台) istream.ostream.iostream 头文件include<iostream> 2.对应文件输入输出 ifstream.ofstream.fstream 头文件 includ

SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*

原文:SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_* 一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又远远没有达到瓶颈.这个IO_COMPLETION到底是在做什么?是表的数据页IO请求还在其他操作?如果是,跟PAGEIOLATCH_*是什么区别?如果不是,又是什么类型的操作? IO_COMPL

python 中文件输入输出及os模块对文件系统的操作

整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作. 文件输入输出 1.内建函数open(file_name,文件打开模式,通用换行符支持),打开文件返回文件对象. 2.对打开文件进行读取时,readline()与readlines()的区别在于是否一次性的读取所有的内容,并将每行的信息作为列表中的一个子项. 例如:文件test.txt中 1,3,4 2,35,6 分别用readline与readlines对其进行读取 r=file_object.readline(