2011-03-24 194 views
68

我想寫代碼讀取二進制文件到緩衝區,然後將緩衝區寫入另一個文件。我有以下代碼,但緩衝區僅存儲文件第一行中的幾個ASCII字符,而沒有其他字符。讀取和寫入二進制文件

int length; 
char * buffer; 

ifstream is; 
is.open ("C:\\Final.gif", ios::binary); 
// get length of file: 
is.seekg (0, ios::end); 
length = is.tellg(); 
is.seekg (0, ios::beg); 
// allocate memory: 
buffer = new char [length]; 
// read data as a block: 
is.read (buffer,length); 
is.close(); 

FILE *pFile; 
pFile = fopen ("C:\\myfile.gif", "w"); 
fwrite (buffer , 1 , sizeof(buffer) , pFile); 
+18

您應該決定使用iostream還是C文件處理。請不要同時使用兩者。 – frast 2011-03-24 14:03:39

回答

123

如果你想做到這一點的C++的方式,像這樣做:

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

int main() 
{ 
    std::ifstream input("C:\\Final.gif", std::ios::binary); 
    std::ofstream output("C:\\myfile.gif", std::ios::binary); 

    std::copy( 
     std::istreambuf_iterator<char>(input), 
     std::istreambuf_iterator<char>(), 
     std::ostreambuf_iterator<char>(output)); 
} 

如果你需要數據對其進行修改或東西的緩衝區,這樣做:

#include <fstream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::ifstream input("C:\\Final.gif", std::ios::binary); 
    // copies all data into buffer 
    std::vector<char> buffer((
      std::istreambuf_iterator<char>(input)), 
      (std::istreambuf_iterator<char>())); 
} 
+0

我想知道這些效率如何? – Mikhail 2013-10-10 09:36:17

+1

如果我只想複製一部分數據緩衝區,該怎麼辦?我如何做到這一點?比方說1024字節。 – likern 2014-07-10 15:45:25

+5

@Mikhail [Here](http://insanecoding.blogspot.it/2011/11/how-to-read-in-file-in-c.html)你可以找到一些基準。 – 2016-02-01 16:06:47

6

sizeof(buffer)是最後一行上指針的大小而不是緩衝區的實際大小。 您需要使用您已經建立的「長度」而不是

4

您應該將長度傳遞給fwrite而不是sizeof(緩衝區)。

13
sizeof(buffer) == sizeof(char*) 

改爲使用長度。

此外,最好使用fopen與「wb」 ......

+0

不能使用緩衝區的'buffer.length()'可能會在其中有NULL值,從而影響strlen/length()的目的。 – 2017-08-30 17:06:08

+0

最好使用'sizeof(buffer)'。 – 2017-08-30 18:50:34

12

下面是一個簡單的例子,使用rdbuf C++的方式。我從網上得到了這個。我找不到我的這個原始出處:

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::ifstream f1 ("C:\\me.txt",std::fstream::binary); 

    std::ofstream f2 ("C:\\me2.doc",std::fstream::trunc|std::fstream::binary); 

    f2<<f1.rdbuf(); 

    return 0; 
} 
+6

最好的,非便攜式的方法是讓操作系統複製你的文件。畢竟,這是它爲謀生所做的一部分。無需*重新發明輪子*。 – 2011-03-24 17:08:48

+7

?沒有命名空間?這是什麼,九十年代? – BarbaraKwarc 2017-01-13 10:31:09

+0

@BarbaraKwarc:根據您的要求更新。 – 2017-01-13 18:16:22

-3

我嚴重不理解爲什麼會有人選擇寫時,它可以在下面的代碼段這樣一個簡單的命令,發生這樣的複雜的代碼。

複製任何大小的整個文件。沒有尺寸限制!

只要使用它。測試和工作!

#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
    ifstream infile; 
    infile.open("source.pdf",ios::binary|ios::in); 

    ofstream outfile; 
    outfile.open("temppdf.pdf",ios::binary|ios::out); 

    int buffer[2]; 
    while(infile.read((char *)&buffer,sizeof(buffer))) 
    { 
     outfile.write((char *)&buffer,sizeof(buffer)); 
    } 

    infile.close(); 
    outfile.close(); 
    return 0; 
} 

具有較小的緩衝區大小將是複製小文件有幫助。即使是「char buffer [2]」 也可以完成這項工作。

+6

如果文件大小不是緩衝區大小的倍數?此外,爲什麼你必須聲明你的緩衝區爲'int []'而不是'char []'? – firegurafiku 2016-05-13 11:33:32

相關問題