我刚刚找到了一种方法,可以将带有迭代器的文件复制到另一个文件中:
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()
做什么?
答案 0 :(得分:4)
istream_iterator<T> iter(stream)
将使用格式化的输入函数,因此++iter
在某种程度上等同于:
T t;
stream >> t;
对于string
个对象,这意味着丢弃任何前导空格并仅读取下一个空格字符。
如果您想要无格式操作,请使用istreambuf_iterator<char>
(如评论中所述)。
答案 1 :(得分:2)
使用迭代器和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 :(得分:1)
取消设置ifstream上的跳过空白标记。
ifile.unsetf(ios_base::skipws);