Я только что нашел способ скопировать файл с итераторами в другой файл:
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()
?
istream_iterator<T> iter(stream)
будет использовать отформатированные функции ввода, так что ++iter
в некоторой степени эквивалентно:
T t;
stream >> t;
За string
объекты это означает отбрасывание любого начального пробела и чтение только до следующего символа пробела.
Если вы хотите использовать неформатированные операции, используйте istreambuf_iterator<char>
(как было отмечено в комментариях).
Возможное решение с использованием итераторов и 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;
}
Снимите флаг пропуска пробелов в ifstream.
ifile.unsetf(ios_base::skipws);
Увидеть http://en.cppreference.com/w/cpp/io/ios_base/unsetf.