C++流类库和输入输出

1、cin、cout、clog、cerr分别用于标准输入、输出、标准错误流(缓冲)和标准错误流(非缓冲)

2、C++标准库中有一个面向对象的输入输出软件包,它就是I/O流类库。流是I/O流类的中心概念。

3、在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。在流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作,数据的输入与输出就是通过I/O流来实现的。

4、当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。流是一种抽象,它负责在数据的产生者和数据的消费者之间建立关系,并管理数据的流动。

5、建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。由于流对象是程序中的对象与文件对象进行交换的界面,对程序对象而言,文件对象具有的特性,流对象也有,所以程序将流对象看作是文件对象的化身。
image
6、一个输出流对象是信息流动的目标,最重要的3个输出流是ostream,ofstream和ostringstream。

7、预先定义的ostream类对象用来完成向标准设备的输出:

①cout是标准输出流

②cerr是标准错误输出流,没有缓冲,发送给它的内容立即被输出

③clog类似于cerr,但是有缓冲,缓冲区满时被输出

【注】通过cout、cerr、clog输出的内容,在默认情况下都会输出到屏幕,标准输出和标准错误输出区别在发生输出重定向时会显露出来。执行程序时可以在命令行使用“>”对标准输出进行重定向,这会使得通过cout输出的内容写到重定向文件中,而通过cerr输出的内容仍然输出到屏幕;使用“2>”可以对标准错误输出重定向,而不会影响标准输出。

8、ofstream类支持磁盘文件输出。如果你需要一个只输出的磁盘文件,可以构造一个ofstream类的对象。在打开文件之前或之后可以指定ofstream对象接受二进制或文本模式数据。很多格式化选项和成员函数可以应用于ofstream对象,包括基类ios和iostream的所有功能。

9、如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的。否则,你可以在调用默认构造函数之后使用open成员函数打开文件,或者在一个由文件指示符标识的打开文件的基础上构造一个ofstream对象。

10、构造输出流对象

①如果你仅使用预先定义的cout、cerr或clog对象,就不需要构造一个输出流。如果要使用文件流将信息输出到文件,便需要使用构造函数来建立流对象。

②构造文件输出流的常用方法如下:
image
11、使用插入运算符和操纵符

①输出宽度:为了调整输出,可以通过在流中放入setw操纵符或调用width成员函数为每个指定项指定输出宽度。
image
空格是默认的填充符,当输出的数据不能充满指定的宽度时,系统会自动以空格填充。使用fill成员函数可为已经指定宽度的域设置填充字符的值。
image
如果要为同一行中输出的不同数据项分别指定宽度,也可以使用setw操纵符。
image
【注】setw和width都不截断数值。如果数值位超过了指定宽度,则显示全部值,当然还要遵守该流的精度设置。setw和width仅影响紧随其后的域,在一个域输出完后域宽度恢复成它的默认值(必要的宽度)。但其他流格式选项保持有效直到发生改变。

②对齐方式:输出流默认右对其文本
image
这个程序中,通过使用带参数的setiosflags操纵符来设置左对齐,setiosflags定义在头文件iomanip中。参数ios_base::left是ios_base的静态常量,因此引用时必须包括ios_base::前缀。这里需要用resetiosflags操纵符关闭左对齐标志。setiosflags不同于width和setw,它的影响是最持久的,直到用resetiosflags重新恢复默认值时为止。
image
③精度:浮点数输出精度的默认值是6,例如,数3466.9768显示为3466.98。为了改变精度,可以使用setprecision操纵符(定义在头文件iomanip中)。此外,还有两个标志会改变浮点数的输出格式,即ios_base::fixed和ios_base::scientific:如果不指定fixed或scientific精度值表示有效数字位数;如果设置了ios_base::fixed,精度值表示小数点之后的位数,该输出为3466.967800;如果设置了ios_base::scientific,精度值表示小数点之后的位数,该数输出为3.466977e+003。
image
如果不需要科学格式,需要在for循环之前插入语句:cout<<setiosflags(ios_base::fixed);
image
同样,该程序在小数点后输出了一位数字,这表明如果设置了ios_base::fixed或ios_base::scientific,则精度值确定了小数点之后的小数位数。如果都未设置,则精度值确定了总的有效位数。可以用resentiosflags操纵符清除这些标志。

④进制

dec、oct和hex操纵符设置输入输出的缺省进制,例如,若将hex操作符插入到输出流中,则以十六进制格式是输出。如果是ios_base::uppercase(默认)标志已清除,该数值以a到f的数字显示,否则,以大写方式显示。默认的进制是dec

12、文件输出流成员函数

①输出流成员函数有如下3种类型

  • 与操纵符等价的成员函数
  • 执行非规格化写操作的成员函数
  • 其他修改流状态且不同于操纵符或插入运算符的成员函数

【注】对于顺序的格式化输出,可以仅使用插入运算符和操纵符。对于随机访问二进制磁盘输出,使用其他成员函数,可以使用或不使用插入运算符

②输出流的open函数

  • 要使用一个文件输出流(ofstream),必须在构造函数或open函数种把该流与一个特定的磁盘文件关联起来。在这两种情况下,描述文件的参数是相同的。

  • 打开一个与输出流关联的文件时,可以指定一个open_mode标志
    image
    ②输出流的close函数

  • close成员函数关闭与一个文件输出流关联的磁盘文件。文件使用完毕后必须将其关闭以完成所有磁盘输出。虽然ofstream析构函数会自动完成关闭,但如果需要在同一流对象上打开另外的文件,就需要使用close函数。

  • 如果构造函数或open成员函数打开了该文件,并且在输出流对象析构前未调用close函数关闭,则输出流析构函数自动关闭这个流的文件。

③put函数:put函数把一个字符写入到输出流中,下面两个语句默认是相同的,但第二个受该流的格式化参量的影响:
image
④write函数:write函数把内存中的一块内容写到一个文件输出流中,长度参数指出写的字节数。

??写了代码之后,没有输出是什么鬼????

【注1】由于C++标准没有限定用reinterpret_cast转换指针时的行为,因此标准不保证以上代码总能将dt的全部内容输出到data.dat文件中。但由于用reinterpret_cast转换指针,一般都会被实现为对原先的地址原样复制,所以上面的代码总能达到目的。

【注2】write函数当遇到空字符时并不停止,因此能够写入完整的类结构,该函数带两个参数:一个char指针(指向内存数据的起始地址)和一个所写的字节数。注意需要用reinterpret_cast将该对象的地址显式转换为char *类型。

⑤seekp和tellp函数

posted @ 2025-04-14 16:27  风归去  阅读(69)  评论(0)    收藏  举报