2012-09-04 134 views
3

複製文本文件,我只是找到了一種迭代器將文件複製到另一個文件: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()做什麼?

+2

也許試試''。我無法確定它是否可行,但這是一個想法。 – chris

+3

使用[istreambuf_iterator](http://en.cppreference.com/w/cpp/iterator/istreambuf_iterator)。 – jrok

+0

當遇到第一個換行符時,字符串將停止... – perilbrain

回答

3
istream_iterator<T> iter(stream)

將使用格式的輸入功能,使++iter是有點相當於:

T t; 
stream >> t; 

對於string對象,這意味着丟棄任何前導空白和僅讀取直到下一個空白字符。

如果您想要使用無格式操作,請使用istreambuf_iterator<char>(如註釋中所述)。

+0

下面的選項感謝給你: ifstream ifile(「main.cc」); ofstream ofile(「main_copy.cc」); copy(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; 
} 
1

取消設置跳過對ifstream的空白標記。

ifile.unsetf(ios_base::skipws); 

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

+0

http://jcatki.no-ip.org/fncpp/cplusplus.com – 2012-09-05 09:17:21

+0

我不明白爲什麼這是downvoted。答案應該是正確的。跳過空白標誌通常默認處於打開狀態,因爲通常人們希望使用輸入流來獲取空格分隔的值。取消設置skipws標誌解決了他的問題。 – user1646801

+0

我同意你,我也不明白爲什麼它被downvoted,謝謝你它的工作原理: ifstream ifile(「main.cc」); ofstream ofile(「main_copy.cc」); ifile.unsetf(ios_base :: skipws); copy(istream_iterator (ifile), istream_iterator (), ostream_iterator (ofile,「」)); –