2013-09-25 39 views
3

我試圖從包含純文本標頭的圖像文件中去除標頭,然後是二進制圖像信息。作爲此前提,我想將文件信息複製到字符串流中進行編輯。當這樣做時,我遇到了一些問題,這些問題導致我嘗試簡單地讀取文件並將其作爲新文件重新寫回以用於調試目的。當我這樣做時,新文件最終比原文大1kb。在UltraEdit中進行二進制比較時,似乎在任何十六進制字符0A(換行符相信)出現的地方,我的程序似乎已在0D(回車符)之前添加。我想知道這種行爲的原因是什麼以及如果可能的話如何避免它。代碼片段如下:使用ifsream和stringstream複製二進制文件時出錯

.... 
std::string inputFilename = argv[1]; 
std::ifstream in(argv[1],ios::out | ios::binary); 
if (in) 
{ 
std::stringstream fileStream; 
fileStream<<in.rdbuf(); 
cout<<fileStream.str().length(); //debugging 
in.close(); 
ofstream myfile; 
myfile.open("selfoutput"); 
myfile<<fileStream.str(); 
myfile.close(); 
.... 

感謝您的幫助! -David

回答

2

嘗試ios:in

std::ifstream in(argv[1],ios::in | ios::binary) 

或者,其實

std::ifstream in(argv[1],ios::binary) 

即相當於:

首先,執行相同的步驟默認構造函數,然後asssociates帶有文件的流通過調用rdbuf()->open(filename, mode | std::ios_base::in) ..如果open()調用返回一個空指針,將 setstate這(failbit)

這裏是我的(未經測試)simplist對其採取:

#include <fstream> 

int main(int /*argc*/, const char *argv[]) 
{ 
    std::ifstream in(argv[1], std::ios::binary); 
    if (in) 
    { 
     std::ofstream myfile("selfoutput", std::ios::binary); 
     if (myfile) 
      myfile << in.rdbuf(); 
    } 
} 

在免費代碼高爾夫和不良風格的興趣:

#include <fstream> 
using namespace std; 

int main(int /*argc*/, const char *argv[]) { 
    ofstream("selfoutput", ios::binary) << ifstream(argv[1], ios::binary).rdbuf(); 
} 
+0

該標誌位於'std :: ifstream'上。但是,它缺少來自std :: ofstream的'open()'。 –

+0

嗯。我不會來那麼遠。我的觀點是,他打開ifstream輸出... – sehe

+0

他正在爲輸入和輸出打開'std :: ifstream'。這沒有什麼特別的意義,但不是實際的問題。實際的問題是不用'std :: ios_base :: binary'選項打開'std :: ofstream'。 –

相關問題