2015-02-07 55 views
0

我在嘗試一個文本文件中的內容複製到另一個基於命令行參數寫這個文件:複製與C++流

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

using namespace std; 

int main(int argc, char* argv[]) { 

    if(argc != 3) { 
     cout << "invalid args!"; 
     return 0; 
    } 

    fstream op(argv[1], ios::in); 
    vector<string> list; 

    string line; 

    while(!op.end) 
     op >> line; 
     list.push_back(line); 

    op.close(); 




    op.open(argv[2], ios::out); 

    for(unsigned int i = 0; i < list.size(); i++) 
     op << list[i]; 

    op.close(); 


    return 0; 
} 

它不會產生任何語法錯誤,但邏輯錯誤是顯而易見的:沒有輸出。

因此,除了缺少錯誤檢查以及有更高效的方法來做到這一點外,我的代碼有什麼問題?即爲什麼它不會將名稱爲argv[1]的文件複製到名爲argv[2]的文件?

回答

1

在有你的代碼有幾個問題:

  • 有了流那就不應該在年底或EOF環(看看衆多SO問題/回答這個)。
  • 封閉{}問題馬庫斯透露
  • 你是不讀的線,但字(operator>>使用空格作爲分隔符)和squizing在輸出中的空格。

這裏如何應對這一切:

while(getline(op, line)) 
    list.push_back(line); 

課程的輸出和:op << list[i]<<endl;

+0

因此流操作符使用空格作爲分隔符? – Dziugas 2015-02-07 15:52:34

+1

是的,任何空間(包括標籤,換行符等等) – Christophe 2015-02-07 15:53:22

3

你有一個錯誤:你while循環體不括在{},所以只有op >> line直到文件完全讀取執行,再line的最後一個值被壓入載體。

編輯:順便說一句,這是一個非常好的例子,爲什麼你應該讓你的編輯器做你的代碼縮進;你的循環看起來很難發現這個錯誤。

+0

哈是一個什麼樣的錯誤歡呼,發現它!這仍然無法解釋爲什麼程序沒有創建文件並將最後一行寫入文件。 – Dziugas 2015-02-07 15:48:38

+0

沒關係..謝謝 – Dziugas 2015-02-07 15:49:21

1

爲一到一個副本,您也可以考慮下面的代碼 - 處理二進制數據,使用較少的內存和更短的:

#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 


int main(int argc, char *argv[]) 
{ 
    if (argc < 3) 
    return 1; 

    fstream s(argv[1], ios::in); 
    fstream d(argv[2], ios::out); 

    copy(
     istreambuf_iterator<char>(s) 
    , istreambuf_iterator<char>() 
    , ostreambuf_iterator<char>(d)); 

    return 0; 
} 
+0

是的,那太好了,好多了。然而,我是C++的全新人物,所以我想窺探它的I/O功能,並採取嬰兒步驟,你知道嗎?我將不得不深入研究這些迭代器。謝謝! – Dziugas 2015-02-07 16:32:13