簡體   English   中英

在C ++中使用流復制文件

[英]Copying a file with streams in 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]的文件中?

您有一個錯誤: while循環的主體未包含在{} ,因此僅執行op >> line ,直到完全讀取文件為止,然后將line的最后一個值壓入向量中。

編輯:順便說一句,這很好地說明了為什么應該讓您的編輯器執行代碼縮進; while循環的外觀來看,很難發現此錯誤。

您的代碼中存在幾個問題:

  • 使用流時,您將不會循環播放或結束播放(請查看有關此的許多SO問題/答案)。
  • 馬庫斯(Marcus)透露的{}所附問題
  • 您不是在閱讀行,而是在閱讀單詞( operator >>使用空格作為分隔符)並在輸出中對空格進行排序。

這里是如何解決所有這些問題的方法:

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

當然是輸出: op << list[i]<<endl;

對於一對一副本,您還可以考慮以下代碼-處理二進制數據,使用更少的內存並且更短:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM