[C++]文件流fstream从txt文件中读取多行与向txt文件存储多行

一、头文件与类型
  文件流类型包含在 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 文件,或者建立在其他目录下,博主建立在了桌面,并输入以下内容:[C++]文件流fstream从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;
}

  最后在目标文件中,会存有输出内容,但最后会多出一个空行,因为每次输出都会输出一个换行符,最后一次输出换行符是多余的。
  另外,如果我们输出目标文件不存在,程序会为我们在我们指定的目录下,创建一个目标文件,并存储输出内容。如果未指定地址,会在源文件的根目录下创建目标文件。

上一篇:c++ 二进制方式读取文件 读取特殊类型数据


下一篇:phpMyAdmin 4.8.1 文件包含复现(CVE-2018-12613)