文件操作

关于文件存取的相关操作

  • iostream 定义读写控制窗口的类型
  • fstream 定义读写已命名的文件的类型
  • sstream定义读写存储在内存中中的string 对象
    //如果函数有基类类型的引用参数时 , 可以给函数传递其派生类型对象 IO对象不可以复制和赋值:
  1. 不能存储在vector或其他容器中
  2. 形参或返回类型也不能是流类型。如果需要传递或返回IO对象,则必须是传递或返回指向该对象的指针或引用

条件状态:
IO对象管理一系列条件状态成员 , 用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
strm::iostate 用于定义条件状态
strm::badbit 此为strm::iostate类型的值 , 用于指出被破坏的流 , 系统级故障
strm::failbit 同样为strm::iostate类型的值 , 用于指出失败的IO操作
strm::eofbit 为strm::iostate类型的值 , 用于指出流是否已经达到文件的结束符
s.eof() 如果设置了流s的eofbit值 , 该函数返回true
s.fail()
s.bad()
s.good() 如果流处于有效状态 , 该函数返回true
s.clear() 将流s的所有状态都设置为有效状态
s.clear(flag) 将流中某个指定条件状态设置为有效 , flag 的类型为 strm::iostate类型
s.setstate(flag) 给流添加指定条件
s.rdstate() 返回流当前条件,返回值的类型为 strm::iostate

warnning: 许多程序只需要知道流是否有效。但某些程序需要更详细的访问或控制流的状态,此时知道的流处于错误状态,还必须了解属于哪种类型的错误

比较正式的管理流的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int ival
while(cin>>ival , !cin.eof()) //这里的cin即为输入流, 可以置换为三流中的任意一个,最好是封装成函数
{
if(cin.bad())
{
throw runtime_error("IO stream corruoted!");
}
if(cin.fail())
{
cerr<<"bad data , try again"<<endl;
cin.clear();
cin.ignore(1024 , ' ');
continue;
}
}

rdstate成员的 使用:

1
2
3
4
istream::iostate old_state = cin.rdstate(); //利用其返回值类型
cin.clear();
//do everything
cin.clear(old_state);

文件的输入和输出

  • fstream 提供对文件的读写
  • ifstream 提供读文件的功能
  • ofstream 提供写文件的功能

open close ## 打开一个文件的方法 ## ### method1 ###

1
2
3
string ifile , ofile;
ifstream infile(ifile.c_str());
ofstream outfile(ofile.c_str());

method2

1
2
3
4
ifstream inflie;
ofstream outfile;
inflie.open(ifile.c_str());
outfile.open(ofile.s_str());

注意: 1.一定要检查文件是否打开成功哦:

1
2
if(!infile)
{cerr<<" "<<endl;}

2.文件读取或写入完毕后一定要关闭

1
2
infile.close();
outfile.close();

3.清除文件流的状态

1
2
infile.clear();
outfile.clear();

文件模式

在打开文件时 , 无论是调用open还是以文件名作为流初始化的一部分,都需要指定文件模式

文件模式是整数常量
//文件流的构造函数和open函数都提供了默认参数设置文件模式

1
2
3
4
5
6
7
8
========================文件模式========
in 打开文件做读操作
out 打开文件做写操作
app 在每写之前找到文件尾
ate 打开文件后立即将文件定位到文件尾
trunc 打开文件时清空已存在的文件流
binary 以二进制模式进行IO操作
========================================

注:

  • out , trunc , app 模式只能用于指定与ofstream或fstream对象关联的文件
  • in模式只能用于指定与ifstreamfstream对象关联的文件
  • atebinary模式可用于所有文件
  • ate:该模式只在打开时有效:文件打开后将定位到文件尾

默认:

  • ifstream流对象相关联的文件将以in模式打开
  • ofstream流对象相关联的文件将以out模式打开
  • fstream流对象相关联的文件默认以inout 模式打开,而且不会将文件清空
  • 对于使用ofstream打开的文件,要保存文件中已存在的数据,唯一的方法是用 app 的方式将文件打开
1
2
3
ofstream outfile("file1" , ofstream::app); //多种模式要使用 | 位操作符哦
outfile.close();
ofstream outfile,open("file2" , ofstream::out);

1
2
3
4
5
6
7
8
=======================打开模式的有效组合====================
out 打开文件, 进行写操作 , 删除文件中已有的数据
out | app 打开文件做写操作, 在文件尾进行写入
out | trunc 与out模式相同
in
in | out
in | out | trunc 打开文件进行读写 , 删除文件中已有的数据
============================================================

打开并检查输入文件的程序

1
2
3
4
5
6
7
8
ifstream& open_file(ifstream& in , const string &file)
{
in.close();
in.clear();//先给上次处理差屁股
in.open(file.c_str());
return in;
}

字符串流

1
2
3
4
5
======================stringstream========================
stringstream strm; 创建自由的stringnstream对象
stringstream strm(s);
strm.str(); 返回strm中存储的string类型的对象
strm.str(s); 复制 赋值

经典片段。。。。处理每一行的每一个单词

1
2
3
4
5
6
7
8
9
10
string line , word;
while(getline(cin , line))
{
istringstream strem(line);
while(strem >> word)
{
//do anything
}
strem.clear();
}

热评文章