3

イテレータを含むファイルを別のファイルにコピーする方法を見つけました。

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

それは機能しますが、残念ながら「file1.txt」からのすべてのテキストは「file2.txt」では1行にしかありませんが、「file1.txt」には元々多くの行があります。

イテレータのループ間で文字列を変更しようとしました:

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

しかし、「file2.txt」での結果はさらに悪いです - すべての単語が別の行にあります。

私の質問: イテレータを使用してファイルをコピーする方法はありますが、情報を失うことはありませんgetline()か?

4

3 に答える 3

4

istream_iterator<T> iter(stream)フォーマットされた入力関数を使用するため、次のよう++iterになります。

T t;
stream >> t;

オブジェクトの場合string、これは先頭の空白を破棄し、次の空白文字までのみ読み取ることを意味します。

代わりにフォーマットされていない操作が必要な場合はistreambuf_iterator<char>、(コメントに記載されているように)を使用してください。

于 2012-09-04T20:19:34.233 に答える
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;
}
于 2012-09-04T20:23:04.043 に答える
2

ifstream のスキップ空白フラグの設定を解除します。

ifile.unsetf(ios_base::skipws);

http://en.cppreference.com/w/cpp/io/ios_base/unsetfを参照してください。

于 2012-09-04T20:28:21.833 に答える