【问题标题】:C++ copying text files with iteratorsC++ 使用迭代器复制文本文件
【发布时间】:2012-09-04 20:11:52
【问题描述】:

我刚刚找到了一种将带有迭代器的文件复制到另一个文件的方法:

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() 来复制?

【问题讨论】:

标签: c++ file text iterator copy


【解决方案1】:

istream_iterator&lt;T&gt; iter(stream) 将使用格式化的输入函数,因此++iter 在某种程度上相当于:

T t;
stream >> t;

对于string 对象,这意味着丢弃任何前导空格并只读取直到下一个空格字符。

如果您想要使用未格式化的操作,请使用 istreambuf_iterator&lt;char&gt;(如 cmets 中所述)。

【讨论】:

  • 感谢您,下面的选项有效:ifstream ifile("main.cc"); ofstream 文件(“main_copy.cc”);复制(istreambuf_iterator(ifile), istreambuf_iterator(), ostreambuf_iterator(ofile));
【解决方案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;
}

【讨论】:

    【解决方案3】:

    取消设置 ifstream 上的跳过空白标志。

    ifile.unsetf(ios_base::skipws);
    

    http://en.cppreference.com/w/cpp/io/ios_base/unsetf

    【讨论】:

    • 我不明白为什么这被否决了。答案应该是正确的。跳过空白标志通常默认打开,因为通常人们希望使用输入流来获取空白分隔的值。取消设置 skipws 标志解决了他的问题。
    • 我同意你的观点,我也不明白为什么它被否决了,谢谢你它有效:ifstream ifile("main.cc"); ofstream 文件(“main_copy.cc”); ifile.unsetf(ios_base::skipws);复制(istream_iterator(ifile), istream_iterator(), ostream_iterator(ofile, ""));
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多