本帖最后由 夜茶微微凉 于 2019-4-26 12:48 编辑
一、头文件与类型
文件流类型包含在 fstream 头文件中,包括以下类型:
ifstream/wifstream 从文件读取数据
ofstream/wofstream 向文件写入数据
fstream/wfstream 读写文件
二、IO库类型间的关系
概念上,设备类型与字符大小都不影响我们要执行的IO操作。我们可以用 >> 读取数据,而不用管是从那里读取,可以是控制台窗口,也可以是磁盘文件(txt文件等),还可以是 string 等。同样,我们也不用管读取的字符的大小(虽然 >> 读取数据都可以进行,但我们应该选择一个适当的存储对象)。
标准库使得我们能忽略这些不同类型的流之间的差异,这是通过**继承机制**实现的(我们先不管继承机制如何工作)。我们可以声明一个特定的类继承自另一个类。我们通常可以将一个派生类(继承类)对象当作其基类(所继承的类)对象来使用。
类型 ifstream 继承自 istream (string 流类型 istringstream 也继承自 istream),所以,我们可以像使用 istream 对象一样来使用 ifstream 对象(不同的在于读取数据的方向不同,istream 从流读取数据,ifstream 从文件读取数据)。例如:我们可以向使用 cin 一样使用一个 ifstream 对象,也可以对该对象调用 getline 函数。类似的,类型 ofstream 继承自 ostream,我们可以像使用 cout 一样,使用 ofstream 对象。
三、从文件中读取数据
首相我们在源文件的根目录下建立一个 txt 文件,或者建立在其他目录下,博主建立在了桌面,并输入以下内容:![写入.txt](
)
接下来我们就可以将这个文件与一个 ifstream 对象绑定,并在控制台窗口输出其中内容:
#include<iostream>
#include<string>
#include<fstream>
using std::ifstream;
using std::string;
using std::cout;
using std::endl;
int main(){
string str;
ifstream ifs("地址\\写入.txt");//地址是文件存储地址,与源文件同一目录下,可以省略
ifs >> str;
cout << str << endl;
ifs >> str;
cout << str << endl;
ifs >> str;
cout << str << endl;
ifs.close();
return 0;
}
执行程序结果:
第一行
123
第二行
从执行结果看,当 >> 遇到空格或换行时,就会终止,并在下次进行 >> 时,从空格或换行后继续进行。
我们可以利用 getline 一行一行的读取:
#include<iostream>
#include<fstream>
#include<string>
using std::cout;
using std::ifstream;
using std::ofstream;
using std::endl;
using std::string;
int main(){
string str;
ifstream ifs("地址\\写入.txt");
for (; ifs.good();) {
getline(ifs, str);
cout << str << endl;
}
ifs.close();
return 0;
}
运行结果:
第一行 123
第二行 234
第三行 456
第四行 567
第五行 678
第六行 789
第七行 890
综上,ifs 与 文件绑定,与 cin 与控制台窗口绑定一样,会将整个文档内容作为输入内容,并利用 >> 或 getline 逐个或逐行输入。
四、向txt文件存储多行
我们将上面文档中的内容存储在另一个文件中。回忆 cout 的用法,如果换行,我们可以利用 endl 控制换行,但是在向文档中输入时,不能用 endl 控制换行,我们可以利用 "\n" 控制换行(windows系统下,需要输入"\r\n"),代码如下:
#include<iostream>
#include<fstream>
#include<string>
using std::cout;
using std::ifstream;
using std::ofstream;
using std::endl;
using std::string;
int main(){
string str;
ifstream ifs("地址\\写入.txt");
ofstream ofs("地址\\输出.txt");
for (; ifs.good();) {
getline(ifs, str);
ofs<<str<<"\r\n";
}
ifs.close();
ofs.close();
return 0;
}
最后在目标文件中,会存有输出内容,但最后会多出一个空行,因为每次输出都会输出一个换行符,最后一次输出换行符是多余的。
另外,如果我们输出目标文件不存在,程序会为我们在我们指定的目录下,创建一个目标文件,并存储输出内容。如果未指定地址,会在源文件的根目录下创建目标文件。
|