c++primer plus第十七章-文件输入和输出

c++primer plus第十七章-文件输入和输出

1)要让程序写入文件,必须这样做,首先应包含头文件fstream。该文件自动包含iostream文件。

第一:创建一个ofstream对象来管理输出流;

第二:将该对象与特定的文件关联起来;

第三:以使用cout的方式使用该对象,唯一的区别是输出将进入文件,而不是屏幕。

ofstream fout;  //声明一个ofstream对象。

fout.open("jar.txt");  //将这个对象与特定的文件关联起来。

ofstream fout("jar.txt");  //可以使用另一个构造函数来将上面两步合成一条语句。

fout<<"Dull Data";   //以使用cout的方式使用out,如将Dull Data放到文件中。


2)由于ostream是ofstream类的基类,因此可以使用所有的ostream方法,包括各种插入运算符定义、格式化方法和控制符。ofstream类使用被缓冲的输出,因此程序在创建像fout这样的ofstream对象时,将为输出缓冲区分配空间。如果创建了两个ofstream对象,程序将创建两个缓冲区,每个对象各一个。像fout这样的ofstream对象从程序那里逐字节地收集输出,当缓冲区填满后,它便将缓冲区内容一同传输给目标文件。由于磁盘驱动器被设计称为大块的方法传输数据,而不是逐字节地传输,因此通过缓冲可以大大提高从程序到文件传输数据的速度。


3)读取文件的要求与写入文件相似,首先包含头文件fstream。

第一:创建一个ifsteam对象来管理输入流;

第二:将该对象与特定的文件关联起来;

第三:以使用cin的方式使用该对象。

ifstream fin;

fin.open("jellyjar.txt");

ifstream fis("jamjar.txt");

当输入和输出流对象过期(或程序终止)时,到文件的连接将自动关闭。另外,也可以使用close()方法来显示地关闭到文件的连接:

fout.close();

fin.close();


4)命令行处理技术

文件处理程序通常使用命令行参数来指定文件。命令行参数是用户在输入命令时,在命令行中输入的参数。

c++有一种让在命令行环境中运行的程序能够访问命令行参数的机制,方法是使用下面的main()函数:

int main(int argc, char *argv[ ])

argc为命令行中的参数个数,其中包括命令名本身。argv变量为一个指针,它指向一个指向char的指针。这过于抽象,但可以将argv看作一个指针数组,其中的指针指向命令行参数,argv[0]是一个指针,指向存储第一个命令行参数的字符串的第一个字符。


命令行:wc  report1  report2  report3

则argc为4,argv[0]为wc,argv[1]为report1,argv[2]为report2,argv[3]为report3。


5)命令行参数与命令行操作系统(如windows命令提示符模式、unix和linux)紧密相关。其他程序也可能允许使用命令行参数。

第一:很多windows IDE(集成开发环境)都有一个提供命令行参数的选项。通常,必须选择一系列菜单,才能打开一个可以输入命令行参数的对话框。

第二:很多windows IDE都可以生成可执行文件,这些文件能够在windows命令提示符模式下运行。


6)文件模式常量

常量                                 含义

ios_base::in              打开文件,以便读取

ios_base::out            打开文件,以便写入

ios_base::ate            打开文件,并移到文件尾

ios_base::app           追加到文件尾

ios_base::trunc         如果文件存在,则截短文件

ios_base::binary       二进制文件


ifstream open()方法和构造函数用ios_base::in(打开文件以读取)作为模式参数的默认值,而ofstream open()方法很构造函数用ios_base::out | ios_base::trunc(打开文件,以读取并截短文件)作为默认值。位运算OR(1)用于将两个位值合并成一个可用于设置两个位的值。


7)二进制文件

每种格式都有自己的优点。文本格式便于读取,可以使用编辑器或字处理器来读取和编辑文本文件,可以很方便地将文本文件从一个计算机系统传输到另一个计算机系统。二进制格式对于数字来说比较精确,因为它存储的是值的内部表示,因此不会有转换误差或舍入误差。以二进制格式保存数据的速度更快。因为不需要转换,并可以大块地存储数据。二进制格式通常占用的空间较小,这取决于数据的特征。然而,如果另一个系统使用另一种内部表示,则可能无法将数据传输给该系统。同一系统不同的编译器也可能使用不同的内部结构布局表示。在这种情况下,则必须编写一个将一种数据转换为另一种的程序。


8)write()和read()

要以二进制格式(而不是文本格式)存储数据,可以使用write()成员函数。这种方法将内存中指定数目的字节复制到文件中。

fout.write((char *) &pl, sizeof pl);

这条语句导致程序前往pl结构的地址,并将开始的36个字节(sizeof pl表达式的值)复制到fout相关联的文件中。


要使用文件恢复信心,请通过一个ifstream对象使用相应的read()方法;

ifstream fin("planets.dat", ios_base:: in | ios_base::binary);

fin.read((char *) &pl, sizeof pl);


9)随机存取

是指直接移动(不是依次移动)到文件的任何位置。随机存取常被用于数据库文件,程序维护一个独立的索引文件,该文件指出数据在主数据文件中的位置。这样,程序便可以直接跳到这个位置,读取(还可能修改)其中的数据。


10)seekg()和seekp()

seekg()将输入指针移动到指定的文件位置,seekp()将输出指针移动到指定的文件位置(实际上,由于fstream类使用缓冲区来存储中间数据,因此指针指向的是缓冲区中的位置,而不是实际的文件)。


seekg()的两个原型:

第一个:basic_istream<char T, traits>& seekg(off_type, ios_base::seekdir);

第二个:basic_istream<char T, traits>& seekg(pos_type);


对于char具体化:

istream & seekg(streamoff, ios_base::seekdir);

istream & seekg(streampos);

第一个原型定位到离第二个参数指定的文件位置特定距离(单位为字节)的位置;第二个原型定位到离文件开头特定距离(单位为字节)的位置。


12)seekg()第一个原型,streamoff值被用来度量相对于文件特定位置的偏移量(单位为字节)。streamoff参数表示相对于三个位置之一的偏移量为特定值(以字节为单位)的文件位置(类型可定义为整型或类)。seek_dir参数是ios_base类中定义的另一种整型,有3个可能的值。常量ios_base::beg指相对于文件开始处的偏移量。常量ios_base::cur指出相对于当前位置的偏移量。常量ios_base::end指出相对于文件尾的偏移量。


seekg()第二个原型,streampos类型的值定位到文件中的一个位置。它可以是类,但是如果是类的话,这个类将包含一个接受streamoff参数的构造函数和一个接受整数参数的构造函数,以便将两种类型转换为streampos值。streampos值表示文件中的绝对位置(从文件开始算起)。可以将streampos位置看作是相对于文件开始处的位置(以字节为单位,第一个字节的编号为0)。

fin.seekg(112);// 将文件指针指向第112个字节,这是文件中的第113个字节。


13)如果要检查文件指针的当前位置,则对于输入流,可以使用tellg()方法,对于输出流,可以使用tellp()方法。它们都返回一个表示当前位置的streampos值(以字节为单位,从文件开始处算起)。创建fstream对象时,输入指针和输出指针将一前一后地移动,因此tellg()和tellp()返回的值相同。然而,如果使用istream对象来管理输入流,而使用ostream对象来管理同一个文件的输出流,则输入指针和输出指针将彼此独立地移动,因此tellg()和tellp()将返回不同的值。


14)内核格式化

读取string对象中的格式化信息或将格式化信息写入string对象中被称为内核格式化。


你可能感兴趣的:(C++,C语言)