C++ primer -- 第 17 章 输入,输出和文件
本章内容为阅读《C++ primer》第六版时所写的一些笔记,仅供自己复习所用。
重点如下:
C++角度的输入和输出
iostream类系列
重定向
ostream类
格式化输出
istream
流状态
文件I/O
使用ifteram类从文件输入
使用ostream类输出到文件
命令行处理
二进制文件
随机文件访问
内核格式化
C++的输入,输出
C++程序吧输入和输出看作是字节流。输入时,程序从输入喽中抽取文件,输出时程序把字节插入输出流。管理输入包含两部:
将流和输入去向的程序关联起来
将流与文件连接起来
为了高效的处理输入,输出引入了缓冲区。
C++的iostream类库管理类很多细节,在程序包含iostream文件将自动创建8个流对象(4个用于 i窄字节流,4个用于宽字节流)
cin对象对英语标准输入流,默认情况下,关联标准的输入设备,wcin对象与此类似,但处理的时wchar_t类型
cout对象与标准的输出流对应,默认情况下与标准输出设备关联。wcout与此类似,但处理的是wchar_t类型
cerr对象与标准错误流。在默认的情况下,这个流被关联到标准输出设备。和这个类没有被缓冲,直接讲信息发到屏幕,wcerr类似
clog对象关联到输出设备,流被缓冲。wlog与此类似
对象代表流
重定向
标注输入,输出通常连接键盘和屏幕,但是很多操作系统支持重定向。
使用cout进行输出
ostream类将数据内部表示(二进制位模式)转换成由字符字节组成的输出流。
重载<<运算符
<< 对基本的数据类型都有支持
unsigned char
signed char
char
short
unsigned short
int
unsigned int
long
unsigned lon
long long
unsigned longlong
float
double
long double
1.输出和指针
定义了插入运算符函数
const signed char*
const unsigned char*
cosnt chat*
void *
C++ 中用于指向字符串存储位置的指针来表示字符串,对与其他类型的指针,如果要打印地址,需要强制转换类型
int eggs = 12;
char * amout = "sozen";
cout << &eggs;
cout << amout;// print string "dozen"
cout << (void *) amout; // prints the address of the "dozen" string
2.拼接输出
运算符函数的返回值为调用运算符函数的对象
cout << "we have " << count << " unhatched chickens.\n";
表达式 cout << "we have "
讲下时字符串,并返回cout对象。上句变化为:
cout << count << " unhatched chickens.\n";
其他的osttream方法
ostream类提供了put和write,两个都是类方法,前者显示字符,后者显示字符串。
刷新缓冲区
缓冲可以节省大量的时间。
也可以使用两个控制符中的一个来强制刷新。
cout << "Hello, good-looking! " << flush;
cout << "Wait just a moment, please" << endl;
控制符也是函数,flush被重载了,flush(cout)
4.文件输入和输出
C++I/O类软件包处理文件输入和输出的方式与标准输入和输入的方式非常类似。
4.1简单的文件I/O
1.创建一个ofstream对象来管理输出流
2.将该对象和特定的文件关联起来
3.使用coutd的方式来使用该对象,唯一的区别是输出是文件,不是屏幕
对于读取对象,如上面的步骤类似
//two statements
ifstream fin; //create ifstream object called fin
fin.open("jellyjar.txt");//opne jellyjar.txt for reading
//one statement
ifstream fis("jamjar.tt");//create fis adn associate with jamjar.tt
输入和输出一样,都是被缓冲的。通过缓冲,传输数据的速度比逐字节传快得多。
当输入和输出流对象过期时,到文件的连接将自动关闭。另外也可以使用close()方法来关闭到文件的连接。fin.close()
关闭这样的连接不会删除流,只是断开流到文件的连接,流管理装置韩式被保留。
4.2流状态检查和is_open()
C++文件流从ios::base类继承了一个流状态成员。正如前面指出的,该成员指出来流状态的信息:**一起顺利,已到达文件尾,I/O操作失败等。如果一起顺利,则流状态为0(没有消息就是好消息)。其他的状态都是通过特定位置设置为1来记录。文件流类还继承了ios_base类报告流状态的方法。
最新的C++检测文件是否被打开的方法是is_open()
if(fin.is_open()) // open attempt failed
{
...
}
这种方式更好的原因是,它能够检测出其他方式不能检测出的微妙问题。例如,以不合适的文件模式打开文件失败。
4.3打开多个文件
同时打开多个文件,需要为每个文件创建一个流。如果依次处理文件可以使用一个流,依次处理多个文件。
4.4命令行处理处理技术
int main(int argc, char* argv[])
argc命令行中的参数个数。argv是指针数组
4.5文件模式
文件模式描述的是文件如何使用读,写,追加等,的方式。
ifstream fin("banjo, ", models1);//constructor with mode argument
ofsteram fout();
fout.open("harp", model2)
4.6 随机存取
随机存取是杂技节移动到文件的任何位置。常用语数据库中。
常用的函数有
istream & seekg(streamoff, ios::seekdir);
istream & seekg(streampos);
streamoff 定位到离第二个参数指定特定位置特定距离的位置。第二个原型定位到离文件开头特定距离的位置。
fin.seekg(30, ios_base::beg); //30 bytes beyond the beginning
fin.seekg(-1, ios_bae::cur); //back up one byte
fin.seekg(0, ios_base::end); // go to the end of file
fin.seekg(112);
要检查文件指针的位置,对于输入流,使用tellg()方法,对输出流使用tellp()方法。两种方法都返回一个表示当前位置的streampos值。
5.内核格式化
读取string对象中的信息,或者格式化写入string队形中被称为内核格式化。(incore formating)。ostringstream类有一个名为str()的成员函数,该函数返回一个被初始化缓冲区内容的字符串对象。
评论