关闭

C++文件操作详解

发表于:2016-10-25 09:41

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:likebeta    来源:51Testing软件测试网采编

#
DoNet
  C++ 通过以下几个类支持文件的输入输出:
  ofstream: 写操作(输出)的文件类 (由ostream引申而来)
  ifstream: 读操作(输入)的文件类(由istream引申而来)
  fstream: 可同时读写操作的文件类 (由iostream引申而来)
  打开文件(Open a file)
  对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。
  要通过一个流对象打开一个文件,我们使用它的成员函数open():void open (const char * filename, openmode mode);
  这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合: ios::in 为输入(读)而打开文件
  ios::out 为输出(写)而打开文件
  ios::ate 初始位置:文件尾
  ios::app 所有输出附加在文件末尾
  ios::trunc 如果文件已存在则先删除该文件
  ios::binary 二进制方式
  这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件”example.bin” 来写入一些数据,我们可以通过以下方式调用成员函数open()来实现:
  ofstream file;
  file.open ("example.bin", ios::out | ios::app | ios::binary);
  ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同: 类 参数的默认方式
  ofstream ios::out | ios::trunc
  ifstream ios::in
  fstream ios::in | ios::out
  只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。
  由 于对类ofstream, ifstream 和 fstream 的对象所进行的第一个操作通常都是打开文件,这些类都有一个构造函数可以直接调用open 函数,并拥有同样的参数。这样,我们就可以通过以下方式进行与上面同样的定义对象和打开文件的操作:
  ofstream file ("example.bin", ios::out | ios::app | ios::binary);
  两种打开文件的方式都是正确的。
  你可以通过调用成员函数is_open()来检查一个文件是否已经被顺利的打开了:bool is_open();
  它返回一个布尔(bool)值,为真(true)代表文件已经被顺利打开,假( false )则相反。
  关闭文件(Closing a file)
  当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。关闭文件需要调用成员函数close(),它负责将缓存中的数据排放出来并关闭文件。它的格式很简单:
  void close ();
  这个函数一旦被调用,原先的流对象(stream object)就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程(process)所有访问了。
  为防止流对象被销毁时还联系着打开的文件,析构函数(destructor)将会自动调用关闭函数close。
  文本文件(Text mode files)
  类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。
  一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符
// writing on a text file
#include <fstream>
using namespace std;
int main()
{
ofstream examplefile("example.txt");
if (examplefile.is_open())
{
examplefile << "This is a line.\n";
examplefile << "This is another line.\n";
examplefile.close();
}
return 0;
}
  从文件中读入数据也可以用与 cin的使用同样的方法:
// reading a text file
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main ()
{
char buffer[256];
ifstream examplefile("example.txt");
if (! examplefile.is_open())
{
cout << "Error opening file"; exit (1);
}
while (!examplefile.eof())
{
examplefile.getline(buffer,100);
cout<<buffer<< endl;
}
return 0;
}
//This is a line.
//This is another line.
  上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。注意我们使用了一个新的成员函数叫做eof ,它是ifstream 从类 ios 中继承过来的,当到达文件末尾时返回true 。
  状态标志符的验证(Verification of state flags)
  除了eof()以外,还有一些验证流的状态的成员函数(所有都返回bool型返回值):
  bad()
  如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
  fail()
  除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
  eof()
  如果读文件到达文件末尾,返回true。
  good()
  这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。
  要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号