从C ++中的文本文件获取格式化的内容

时间:2019-03-14 06:40:33

标签: c++ file

我具有以下功能,该功能可以通过以下方式将文本保存为特定格式的内容:

#include <fstream>   
#include <iostream> 
#include <iomanip>

int main () 
{
    using namespace std;

    fstream fs;
    string str1 = string("1");
    string str2 = string("12");
    string str3 = string("123");
    string str4 = string("1234");

    fs.open ("text.txt", std::fstream::in | std::fstream::out | std::fstream::app);

    fs << left << setfill(' ')
        << setw(10) << str1 << " | "
        << setw(10) << str2 << " | "
        << setw(10) << str3 << " | "
        << setw(10) << str4 << '\n';

    fs.close();

    return 0;
}

一旦执行了以下程序,在文件内将看到以下文本:

POS = 0123456789012345678901234567890123456789
TXT = 1       | 12      | 123     | 1234    |

此函数读取文件的内容:

#include<iostream>
#include<fstream>

using namespace std;

int main() {

    ifstream myReadFile;
    myReadFile.open("text.txt");
    char output[100];
    if (myReadFile.is_open()) {
        while (!myReadFile.eof()) {
            myReadFile >> output;
        }
        cout<<output;
    }
    myReadFile.close();
    return 0;
}

问题是当我显示output变量的内容时,它失去了文本内的格式,看起来像这样:

POS = 0123456789012345678901234567890123456789
TXT = 1|12|123|1234|

如何获取文件中包含的格式的文本?

1 个答案:

答案 0 :(得分:1)

while(file)循环中,唯一可以接受的用例是在循环内进行一次读取。但是,while (!file.eof())后面跟格式化的提取器运算符或在读取操作之后是否有任何处理时,总是错误的。因此,请坚持旧的无限循环,并在每次读取操作后进行测试。

如果要保留输入行中的空格,例如处理固定大小的字段文件,恕我直言,最简单的方法是使用std::getline整体读取行:

#include <string>
...
    string output;
    if (myReadFile.is_open()) {
        for(;;) {
            getline(myReadFile, output);
            if (!myReadFile) break
            cout << output << "\n";
        }
        myReadFile.close();
    }

但是实际上,单个getline是通用阅读循环规则的一个例外,使用它会更加惯用:

        while (getline(myReadFile, output)) {
            cout << output << "\n";
        }