Получить содержимое отформатировано из текстового файла в C ++ - PullRequest
1 голос
/ 14 марта 2019

У меня есть следующая функция, которая сохраняет в текстовом файле содержимое в определенном формате следующим образом:

#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 Ответ

1 голос
/ 14 марта 2019

Только одно чтение внутри цикла является единственным приемлемым вариантом использования для цикла while(file).Но while (!file.eof()) всегда неверно, если за ним следует оператор форматированного извлечения или если после операции чтения происходит какая-либо обработка.Так что придерживайтесь старого доброго бесконечного цикла и проверяйте после каждой операции чтения.

Если вы хотите оставить пробелы в строке ввода, например, для обработки файла полей фиксированного размера, самый простой способ IMHO - эточитать строку целиком с помощью 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";
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...