簡體   English   中英

用C ++將一個文件的內容復制到另一個文件

[英]Copying contents of one file to another in C++

我正在使用以下程序嘗試將文件src的內容復制到另一個目標,在C ++中。 簡化代碼如下:

#include <fstream>
using namespace std;
int main()
{
  fstream src("c:\\tplat\test\\secClassMf19.txt", fstream::binary);
  ofstream dest("c:\\tplat\\test\\mf19b.txt", fstream::trunc|fstream::binary);
  dest << src.rdbuf();
  return 0;
}

當我在Windows中使用帶有GCC編譯器的CODEBLOCKS ide構建並執行程序時,創建了一個名為“.... mf19.txt”的新文件,但沒有數據被復制到其中,並且filesize = 0kb。 我很肯定我在“... secClassMf19.txt”中有一些數據。

當我在Windows Visual C ++ 2008中編譯相同的progeam時,我遇到了同樣的問題。

任何人都可以幫助解釋為什么我會得到這種意外的行為,更重要的是,如何解決問題?

在使用這些流之前,您需要檢查打開文件是否實際成功。 此外,檢查一切事后是否正確,從來沒有傷害過。 將您的代碼更改為此並報告回:

int main()
{
    std::fstream src("c:\\tplat\test\\secClassMf19.txt", std::ios::binary);
    if(!src.good())
    {
        std::cerr << "error opening input file\n";
        std::exit(1);
    }
    std::ofstream dest("c:\\tplat\\test\\mf19b.txt", std::ios::trunc|std::ios::binary);
    if(!dest.good())
    {
        std::cerr << "error opening output file\n";
        std::exit(2);
    }
    dest << src.rdbuf();
    if(!src.eof())
        std::cerr << "reading from file failed\n";
    if(!dst.good())
        std::cerr << "writing to file failed\n";
    return 0;
}

我打賭你會報告前兩次檢查中的一次命中。

如果打開輸入文件失敗,請嘗試使用打開它std::ios::in|std::ios::binary ,而不是僅僅std::ios::binary

你有什么理由不使用CopyFile功能嗎?

最好

在編寫時,您的src實例是常規fstream,並且您沒有為輸入指定打開模式。 簡單的解決方案是使src成為ifstream一個實例,並且您的代碼可以運行。 (只需添加一個字節!)

如果您測試了輸入流(如sbi建議的那樣),您會發現它沒有正確打開,這就是您的目標文件大小為零的原因。 它在寫入模式下打開(因為它是一個ofstream ),截斷選項使其為零,但寫入rdbuf()的結果只是失敗了,沒有寫入任何內容。

另一件需要注意的是,雖然這對小文件很好,但對於大文件來說效率非常低。 您正在將源文件的全部內容讀入內存,然后在一個大塊中再次寫出來。 這浪費了很多記憶。 你最好以塊的形式讀取(例如1MB,磁盤緩存的合理大小)並一次寫一個塊,最后一個是大小的剩余部分。 要確定源的大小,您可以搜索到最后並查詢文件偏移量,然后您就知道要處理的字節數。

如果您使用本機API,您可能會發現您的操作系統在復制文件時效率更高,但隨后它變得不那么便攜。 您可能希望查看Boost文件系統模塊以獲取可移植解決方案。

暫無
暫無

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

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