Считать из файла текст с несколькими абзацами

Подскажите, как считать из файла текст, в котором находится несколько абзацев. Я считываю вот так:

string text;
ifstream in("input.txt");
if (in.is_open()) 
  getline(in, text);

Но данный код считывает только первый абзац. Как можно решить эту проблему?


Ответы (2 шт):

Автор решения: Ildar

у string есть конструктор который принимает input итераторы, его можно использовать чтобы записать весь txt файл в строку

#include <iostream>
#include <fstream>
#include <iterator>

int main()
{
  std::ifstream in("input.txt", std::ios_base::in);
  std::string text(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());

  std::cout << text;
}

getline по умолчанию до '\n' (конца строки) считывает или если файл заканчивается, поэтому у вас не весь текст в строке оказывается

→ Ссылка
Автор решения: Stanislav Volodarskiy

Вам показалось что ваша программа прочитала абзац текста. В действительности программа прочитала только одну строку. Просто строка длинная и при отображении не помещается в экран по ширине. Вот вы её и видите как несколько строк или абзац текста. Но технически это одна строка.

Вам нужно прочитать все строки из файла. Проще всего это делать в цикле while. getline возвращает истину если очередная строка прочитана и ложь иначе:

std::string line;
while (getline(in, line)) {
    // process one line
}

Если вы не хотите обрабатывать текст построчно, то можно прочитать файл целиком. Прямолинейного способа нет, есть разные трюки. Например трюк, когда вы копируете файловый поток в строковый поток, а из строкового потока получаете строку:

stringstream buffer;
buffer << in.rdbuf();
string text = buffer.str();
→ Ссылка