C ++ копирование текстовых файлов с помощью итераторов

Я только что нашел способ скопировать файл с итераторами в другой файл:

ifstream ifile("file1.txt");
ofstream ofile("file2.txt");
copy(istream_iterator<string>(ifile),
istream_iterator<string>(),
ostream_iterator<string>(ofile, " "));

Это работает, но, к сожалению, весь текст из «file1.txt» находится в одной строке в «file2.txt», но первоначально в «file1.txt» много строк.

Я пытался изменить строку между циклами итератора:

copy(istream_iterator<string>(ifile),
istream_iterator<string>(),
ostream_iterator<string>(ofile, "\n"));

но результат в «file2.txt» хуже — каждое слово в отдельной строке.

Мой вопрос:
любой способ скопировать файл с итераторами, но без потери какой-либо информации, или я должен сделать это с getline()?

3

Решение

istream_iterator<T> iter(stream) будет использовать отформатированные функции ввода, так что ++iter в некоторой степени эквивалентно:

T t;
stream >> t;

За string объекты это означает отбрасывание любого начального пробела и чтение только до следующего символа пробела.

Если вы хотите использовать неформатированные операции, используйте istreambuf_iterator<char> (как было отмечено в комментариях).

4

Другие решения

Возможное решение с использованием итераторов и std::getline():

#include <iostream>
#include <string>
#include <iterator>
#include <fstream>
#include <algorithm>

// Define a struct and operator>> for reading lines.
//
struct line
{
std::string buf;
operator std::string() const { return buf; }
};
std::istream& operator>>(std::istream& a_in, line& a_line)
{
return std::getline(a_in, a_line.buf);
}

int main()
{
std::ifstream in("main.cpp");
std::ofstream out("copy.cpp");

std::copy(std::istream_iterator<line>(in),
std::istream_iterator<line>(),
std::ostream_iterator<std::string>(out, "\n"));

return 0;
}
2

Снимите флаг пропуска пробелов в ifstream.

ifile.unsetf(ios_base::skipws);

Увидеть http://en.cppreference.com/w/cpp/io/ios_base/unsetf.

1