代码改变世界

C++学习笔记 2014-9-21

2014-09-21 21:24  想打架的蜜蜂  阅读(198)  评论(0)    收藏  举报

I/O流

1、假定程序已经定义好了一个名为in_stream的流,这个流来源于某一个文件,那么,使用来自文件的一个数字来填充int变量the_number:

int   the_number;

in_stream>>the_number;

假定程序中已经定义好了一个名为out_stream的输出流,这个流发送给另一个文件,若将上述变量的值发送给那个文件。以下语句将输出the_number的值,所以输出都发送给out_stream流连接的那个文件:

out_stream<<the_number

一旦流连接到希望的文件,程序就像执行键盘和屏幕I/0那样来执行文件I/0。

文件提供了永久保存数据的方式,如果程序从一个文件获得输入,称为读取文件,程序将输出发送给文件,成为写入文件。

“输入文件流”变量的类型名称是ifstream;“输出文件流”变量的类型ofstream,所以,要将in_stream声明为一个用于文件的输入流,将out_stream申明为用于另一个文件的输出流,需要使用下面的语句:

ifstream  stream;

ofstream  out_stream;

ifstream 和ofstream 类型在头文件为fstream的一个库中定义,所以任何程序想以这种方式来申明流,必须包含以下预编译指令(通常放在接近文件开头的位置):#include <fstream>

流变量(in_stream和out_stream)必须连接到一个文件,这称为打开文件,如将输入流in_stream连接到一个名为infile.dat的文件,程序必须首先执行下面语句才能从该文件读取输入:

in_stream.open(”infile.dat“);

如果out_stream.open(”infile.dat“),成员open会建立一个尚不存在的输出文件。如果输出文件已经存在,成员函数open就会丢弃文件的内容,在调用open函数之后,输出文件为空。如果想追加数据至现有文件之后,采用打开方式:outstream.open("important.txt",ios::app),如果文件不存在,他就会新建一个具有该名称的空文件,若已经存在,则将所有输出追加至这个文件的末尾。其中ios::app是一个特殊常量

程序结束从一个文件获得输入,或者将输出发送给文件时,每个文件都应该关闭,关闭文件导致流与文件断开,你需要调用close()函数来关闭文件。close()函数没有参数,如果程序正常终止没有关闭文件,系统会自动为你关闭文件,假如程序异常终止,文件就不会关闭文件,并可能受损,假如文件在结束处理后关闭文件,文件受损的可能性就大大降低,你可能希望程序将输出发送给一个文件,以后又将那些输出读回程序,为此程序应该在完成向文件的写入之后立即关闭文件,再用open函数将文件连接到一个输入流(也可以打开一个文件,并同时进行输入和输出,但是方式稍有差别)

2、无论in_stream还是out_stream还是cin或者cout流,其实都是对象,对象都是变量,与对象关联的函数称为成员函数,如上面open函数。不同对象有不同的成员函数,他们可能同名,如果一个类型的变量是对象,这个类型就是类,上面的圆点称作圆点操作符

3、检查文件是否打开成功:可用成员函数fail来测试一个流操作是否失败,fail函数没有参数,返回一个bool值,如果返回true,open调用失败

4、exit语句:exit(1)语句造成程序立即终止,exit函数将他的实参返回给操作系统,为了使用exit函数,函数中必须包含以下include预编译指令:#include<cstdlib>,exit函数是一个预定于函数,它取任意一个整数作为实参,但是根据预约:如果是因为一个错误而调用exit,就用1作为实参,否则使用0

前面讲过格式化浮点数,使其输出两位小数,用下面三条语句:

cout.set(ios::fixed);

cout.set(ios::showpoint);

cout.precision(2);

如果要求输出发送给输出流out_stream连接的一个文件,就可使用同样的命名来保证带小数点的数字采用标准的货币金额格式来写如,只需要插入下面语句:

out_stream.setf(ios::fixed);//流采用定点数表示法来输出double类型的数据,如果是ios::showpoint要求流总是在浮点数中包含一个小数点

out_stream.set(ios::showpoint);

out_stream.precision(2);

注:只对out_stream流有效

ios::fixed,如果设置这个标记,就不用e计数法来写浮点数,系统自动取消设置ios::showpoint标志

ios::scientific 如果设置了这个标记,就会用e计数法来写浮点数,系统会自动取消设置ios::fixed标志

ios::showpoint  如果设置了这个标记,就始终为浮点数显式小数点和尾随的0,如果不设置这个标记,而且一个数字在小数点之后全是0,那么他在输出时可能既没有小数点也没有尾随的0

ios::showpos 如果设置这个标志,正整数之前会输出一个正号

ios::right 如果设置这个标记,而且通过调用成员函数width来指定了某个域宽值,那么输出的下一项会定位在指定的那个域的右侧(右对齐)。输出项之前会根据需要添加用于填充的空格,如果设置了该标志,则自动取消了ios::left标志

ios::left 如果设置这个标记,而且通过调用成员函数width来指定了某个域宽值,那么输出的下一项会定位在指定的那个域的左侧(左对齐)。输出项之前会根据需要添加用于填充的空格,如果设置了该标志,则自动取消了ios::right标志

如果你想取消你设置的标志,用unsetf函数即可。