输入/输出的文件
C + +提供下面的类执行输出和输入的字符/从文件:
ofstream这样的:Stream类写上文件
ifstream的 Stream类从文件读取
fstream的 Stream类读取和写入/文件。
这些类直接或间接派生类istream的 ,和ostream。 我们已经使用的对象类型,这些类:CIN类istream和COUT的是一个对象,是一个对象类ostream。 因此,我们已经使用了类,都涉及到我们的文件流。 而事实上,我们可以使用我们的文件流,以同样的方式,我们已经习惯了使用CIN和COUT,唯一的区别是,我们不得不联想到这些物理文件流。 让我们看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12
// basic file operations #include #include using namespace std; int main () { ofstream myfile; myfile.open ( "example.txt" ); myfile << "Writing this to a file.\n" ; myfile.close(); return 0; }
[文件example.txt中]
写入到一个文件。
这段代码创建了一个名为example.txt文件 ,并插入一个句子以同样的方式,我们是用来做与COUT,但myfile的,而不是使用文件流。
但是,让我们走一步看一步:
打开一个文件
通常这些类的对象进行的第一个操作是一个真正的文件关联。 这个过程被称为打开一个文件 。 在一个程序中由一个流对象(其中一个类的实例化,在前面的例子中,这是myfile的 ),此流对象上执行的任何输入或输出操作将被应用到与它相关联的物理文件,表示一个打开的文件。
为了打开一个文件,我们使用了它的成员函数open()的流对象:
打开(文件名 ,模式);
其中filename是一个空字符结尾的序列类型为const的char *(同一类型的字符串文字)下列标志的组合,代表要打开的文件名 和模式是一个可选参数:
的ios ::打开输入操作。
使用ios :: out打开输出操作。
二进制的ios ::以二进制模式打开。
的ios ::的初始位置设定在该文件的末尾。
如果这个标志没有被设置为任何值,初始位置是在文件的开头。
应用程序的ios ::所有输出的操作都在该文件的末尾,追加内容的文件的当前内容。 这个标志只能用于流为仅输出操作开放。
IOS :: TRUNC如果打开的文件输出操作之前已经存在,其以前的内容被删除,取而代之的新。
所有这些标志可以组合使用位运算符OR(|)。 例如,如果我们想打开文件example.bin,二进制模式中添加数据,我们能做到这一点由下面的调用成员函数打开():
1 2
ofstream myfile; myfile.open ( "example.bin" , ios::out | ios::app | ios::binary);
每一个类ofstream这样的open()成员函数,ifstream和fstream的文件被打开,如果没有第二个参数的默认模式,用于:
类默认模式参数
ofstream的使用ios :: out
ifstream的的ios ::
fstream的使用ios :: |使用ios :: out
对于ifstream和ofstream的类, 使用ios ::和ios ::自动分别假设,即使通过一个模式,不包括他们的open()成员函数的第二个参数。
默认值是不指定任何模式参数值仅适用于如果函数被调用。 如果函数被调用时,参数中的任何值,默认模式是覆盖,而不是合并。
以二进制模式打开文件流独立进行输入和输出操作,任何格式的考虑。 被称为非二进制文件文本文件和一些翻译可能发生由于一些特殊的字符格式(如换行和回车字符)。
由于一个文件流对象上执行的第一个任务一般是打开一个文件,这三个类包括自动调用的open()成员函数的构造函数具有完全相同的参数作为该会员。 因此,我们也可以宣布以前myfile的对象,并进行了同样的开放操作写在我们前面的例子:
ofstream myfile ( "example.bin" , ios::out | ios::app | ios::binary);
在一条语句中结合对象的构造和流口。 这两种形式打开一个文件是有效和等价的。
如果要检查一个文件流是成功的打开一个文件,你可以做到通过调用到:成员IS_OPEN()不带参数。 这个成员函数返回一个bool值,真实的情况下,确实流对象是与一个打开的文件,否则返回false:
if (myfile.is_open()) { /* ok, proceed with output */ }
关闭文件
当我们完成我们的输入和输出操作一个文件,我们将其关闭,其资源再次成为可用。 为了做到这一点我们要调用流的成员函数close()。 这个成员函数没有参数,它的作用是关联的缓冲区刷新并关闭该文件:
myfile.close();
一旦这个成员函数被调用时,流对象可以用来打开另一个文件,该文件是由其他进程再次被打开。
一个对象被破坏,同时还伴随着一个打开的文件的情况下,析构函数会自动调用成员函数close()。
文本文件
文本文件流是那些我们不包括的ios :: binary标志在他们的开幕式模式。 这些文件存储文本,因此所有的值,我们输入或输出/他们可以承受一定的格式转换,不一定对应的其字面二进制值。
以同样的方式,我们经营与 cout进行数据输出文本文件的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// writing on a text file #include #include using namespace std; int main () { ofstream myfile ( "example.txt" ); if (myfile.is_open()) { myfile << "This is a line.\n" ; myfile << "This is another line.\n" ; myfile.close(); } else cout << "Unable to open file" ; return 0; }
[文件example.txt中]
这是一条线。
这是另一条线。
从一个文件中的数据的输入,也可以以同样的方式,我们做了与霉素 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// reading a text file #include #include #include using namespace std; int main () { string line; ifstream myfile ( "example.txt" ); if (myfile.is_open()) { while ( getline (myfile,line) ) { cout << line << endl; } myfile.close(); } else cout << "Unable to open file" ; return 0; }
这是一条线。
这是另一条线。
最后这个例子读取一个文本文件,并打印出屏幕上的内容。 我们已经创建了一个while循环读取文件的一行行,使用函数getline 。 getline函数返回的值是一个引用流对象本身,它作为一个布尔表达式(while循环)评估时,是真实的,如果流准备更多的操作,和虚假的,如果不是最终的文件有已达到或某些其他错误发生。
检查状态标志
除了好(),检查流是否已准备好输入/输出操作,存在其他成员函数来检查流的特定状态(所有的人都返回一个bool值):
不好()
如果读或写操作失败,则返回true。 例如尝试写入到一个文件就是打不开书面或者如果我们尝试写设备的情况下,我们有没有剩余空间。
(失败)
在相同的情况下,坏的()返回true,而且在格式错误的情况发生,比如当我们试图读取一个整数提取字母字符时。
EOF()
返回true,如果打开一个文件的阅读,已经走到了尽头。
好()
这是最常用的状态标志:在同一案件中,调用以前的任何功能将返回true,则返回false。
为了检查我们刚才看到的这些成员函数我们可以使用成员函数明确(),不带参数复位状态标志。
get和put流指针
所有I / O流对象,至少有一个内部的流指针:
Ifstream和istream类似,有一个指针指向已知的 get 指针 ,该指针指向的元素,以读取下一个输入操作。
Ofstream和ostream类似,有一个指针,即把指针指向要写 入的下一个元素的位置。
最后,fstream的 ,既继承,get和put指针,从iostream(本身是istream和ostream的来自)。
这些内部流指针指向读取或写入流内的位置可以被操纵,使用下面的成员函数:
所以tellg()和tellp()
这两个成员函数没有参数和返回类型pos_type成员的值,这是一个整数数据类型的get流指针的当前位置( 所以tellg的情况下)或put流指针(在输出流用tellp的情况下)。
seekg()和seekp()
这些功能使我们能够改变的get和put流指针的位置。 这两个函数的重载有两个不同的原型。 第一架原型机是:
seekg(位置);
seekp(位置);
使用这个原型,流指针被改变的绝对位置的位置 (从该文件的开头算起)。 此参数的不同返回的函数所以tellg和tellp的部件,它是一个整数值类型pos_type相同。
这些函数的原型是:
seekg(偏移方向);
seekp(偏移方向);
使用此原型中,获取或放置指针的位置被设置为相对于一些特定的点,确定的参数方向的偏移值, 偏移量 ,这也是一个整数类型的成员类型off_type。 和方向是类型seekdir的 ,这是一个枚举类型( 枚举 ),从那里偏移计算从确定的点,并可以使用任何的下列值:
的ios ::乞讨的从该流的开始计数的偏移
的ios ::电流从流指针的当前位置的偏移量计算
的ios ::结束偏移计算从流末尾,则