2013-03-17 78 views
0

我在讀取和寫入二進制信息時遇到了一些麻煩。我可以成功地寫一個簡單的字符串到文本文件,在這種情況下,我的文件'output.dat'包含句子「你好,這是一個句子」。使用C++讀取和寫入二進制信息

但是,我無法讀回我的信息。我無法確定問題。我打算改變從二進制文件讀取的信息的每一個字節,以便返回值作爲字符串幫助。

感謝您提供的任何幫助。

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

void write(const string &input) { 
    fstream output("output.dat", ios::out | ios::binary); 
    if (output.is_open()) { 
     output.write(input.c_str(), input.size()); 
     output.close(); 
    } 
} 

string read(const string &fname) { 
    int size; 
    char* buffer; 
    fstream input(fname, ios::in | ios::binary); 
    if (input.is_open()) { 
     input.seekg(0, ios::end); 
     size = input.tellg(); 
     input.seekg(0, ios::beg); 
     buffer = new char[size]; 
     input.read(buffer, size); 
     input.close(); 
    } 
    string result(buffer); 
    return result; 
} 

int main() { 
    cout << read("output.dat") << endl; 

    system("pause"); 

    return 0; 
} 
+0

上面的代碼有什麼問題?它對我來說工作得很好。你沒有寫任何文件來期望任何東西。 – 2013-03-18 00:24:36

+0

我認爲整個問題是當我重寫我的閱讀功能。我忘了初始化緩衝區的大小。我現在唯一的問題是如何在寫入信息之前向每個字節添加5? – Battleroid 2013-03-18 00:30:49

+0

您的更新代碼泄漏內存。 [**不要在這裏使用指針和'new'](http://klmr.me/slides/modern-cpp/) – 2013-03-18 10:11:28

回答

3

錯誤在這裏。

char* buffer; 
input.read(buffer, size); 

您正在閱讀buffer指向的內存。

但它指向哪裏?指針buffer從未被初始化。

如果您知道您需要多少空間,可以使用類似這樣的方法。

std::vector<char> buffer(size); 
input.read(&buffer.front(), size); 
+1

「如果您知道您需要多少空間」,則需要的空間是「大小」。我認爲'char buffer [size];'可能在一些編譯器中工作? – Shoe 2013-03-17 23:53:38

+0

如果我不確定需要多少空間,該怎麼辦?謝謝你的方式。 – Battleroid 2013-03-17 23:54:16

+0

固定緩衝區實際上從來都不是正確的答案。只需使用'std :: vector'。 – 2013-03-17 23:54:42

0

我真的不明白這段代碼出了什麼問題,因爲它看起來很好,並且可以正常工作。儘管如此,您分配的緩衝區缺少用於標記char-string結尾的空終止符。只需將其更改爲:

buffer = new char[size+1]; 
input.read(buffer, size); 
buffer[size] = 0; 
+0

是的,我只是忘了添加一行並指定緩衝區的大小。我覺得自己像個白癡,但至少現在起作用了。 – Battleroid 2013-03-18 01:26:57

相關問題