C++prime之输入输出文件

发布时间 2023-11-04 20:41:33作者: Cr不是铬

作为一种优秀的语言,C++必然是能操作文件的,但是我们要知道,C++是不直接处理输入输出的,而是通过一族定义在标准库中的类型来处理IO的。

‘流’和‘缓冲区’

‘流’和‘缓冲区’

C++程序把输入输出看作字节流,并且其只检查字节流,不需知道字节来自何方。

管理输入包括两步:将流与输入去向的程序关联起来;将流与文件连接起来。

图示:
file
通常使用缓冲区可以更高效地处理输入输出。缓冲区是用作中介的内存块,它是将信息从设备传输到程序或者次程序传递到设备的临时存储工具。

缓冲方法:

从磁盘上读取大量信息,将这些信息存储在缓冲区中,然后每次从缓冲区里读取一个字节,因为从内存中读取单个字节的速度比从硬盘上读取快很多,所以这种方法更快,也更方便。当然,代打缓冲区尾部的时候,程序将从磁盘上读取另一块数据。

(图示)
file

在输出的时候,程序首先填满缓冲区,然后把整块数据传输给硬盘,并清空缓冲区。这被称为“刷新缓冲区”

Tips:当我们按下回车键的时候会刷新缓冲区的。

一些补充:
file

重定向

标准输入和输出通常连接着屏幕与键盘,但也可以通过‘输入重定向与输出重定向改变’。
file

但是注意,cerr与clog不会被重定向,错误仍然在屏幕显示。

使用cout进行输出

"<<"在ostream类重新定义,重载为输出。对于每种数据类型,ostream类都提供了operator<<()函数的定义
file

其他ostream方法:cout是调用方法的对象,put()是类成员函数。和"<<"运算符函数一样,该函数也返回一个指向调用对象的引用,因此也可以用它拼接输出。

cout.put('I').put('t')

刷新输出缓冲区

如果程序使用 cout 将字节发送给标准输出,情况将如?由于stream类对 cout对象处理的输出进行缓冲,所以输出不会立即发送到目标地址,而是被存储在缓冲区中,直到缓冲区填满。然后,程序将刷新 (flush)缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。通常,缓冲区为 512字节或其整数倍。当标准输出连接的是硬盘上的文件时,缓冲可以节省大量的时间。毕竟,不希望程序为发送512个字节,而存取磁盘 512次。将512个字节收集到缓冲区中,然后一次性将它们写入硬盘的效率要高得多。

在屏幕输出时候,程序不必等到缓冲区被填满。(图示)
file

cin进行输入

跳过空白,空格,换行,制表符等

其他istream类方法

get(char &)与get(void)提供不跳过空白单字符输入功能。

get(char,int,char)和getline(char,int,char)读取整行。

文件输入与输出

要写入文件,创建一个ofstream对象,并使用ostream方法,如<<插入运算符或write()

要读取文件,创建一个ifstream对象,并使用istream方法,如>>运算符或get( )
file

打开多个文件

ifstream fin;
fin.open("fat.txt")
...
fin.close();
fin.clear();
fin.open("rat.txt")
...
fin.close()

文件模式

string类的输入
 //C风格
char info[100]
cin>>info;
cin.getline(info,100)
cin.get(info,100)

//string 对象
string stuff;
cin>>stuff;
getline(cin,stuff)

本文由博客一文多发平台 OpenWrite 发布!