2012-03-01 61 views
1

我打開二進制讀的istream:的IStream ::瞭解不填充字符數組正確

ifstream file; 
file.open (this -> fileName.c_str(), ios::binary); 

然後我嘗試讀取,而文件是好的,成字符數組指針:

char data[numberOfBytes]; 
char * p = data; 
file.read(p, numberOfBytes); 
cout << "size: " << sizeof(p)  << end 
cout << "gcount: " << file.gcount() << endl; 
cout << "strlen: " << strlen(p)  << endl; 

對於上述每個輸出都不相同。 Sizeof()產生4是char指針的正確大小。 gcount()產生任何值numberOfBytes。但是,strlen()會返回其他一些較小的數字。所以,儘管read()已經移動了istream指針numberOfBytes,但是char數組中沒有這些字節。我想要char數組中的所有這些字節。我如何實現這一目標?到底是怎麼回事?

回答

4

如果您正在讀取二進制數據,那麼您可能正在讀取值爲零的字節,或字符串術語中的空字符。

strlen()計算字符串的大小的方法是從字符串的開始處開始計數,直到達到空字符。

因此,strlen()將只報告空字符的字節數,而不是實際讀取的字節數。

+0

以下所有答案都是正確的。這是我的問題:我通過udp套接字發送數據數組。在接收端,我不得不重建(因此寫入istream),但我不知道有多少字節。我只是將這些信息添加到我的數據包結構中,現在一切都很好,謝謝! – 2012-03-01 07:50:49

2

strlen報告直到但不包括第一個空字節的字節數。

2

函數strlen對字節數進行計數,直到找到一個爲零的字節。難道數據不是全部可打印的字符?

1

在您的二進制字符串中可能有EOFNULL等效於strlen

3

試試這個:

我只能猜測,你有沒有初始化numberOfBytes。我只是複製和打印,它正在爲我工​​作:

//file test.C 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstring> 

using namespace std; 

int main() { 

    ifstream file; 
    file.open ("test.C", ios::binary); 
    char data[1024]; 
    char *p = data; 
    file.read(p, 1024); 
    cout << "size: " << sizeof(p)  << endl; 
    cout << "gcount: " << file.gcount() << endl; 
    cout << "strlen: " << strlen(p)  << endl; 
    cout << "data: " << p << endl; 

    return 0; 
}