2014-04-30 79 views
1

我想從二進制文件中讀取字符串,但似乎無法使其工作。我是一個相當新的C++。任何人都可以幫忙嗎?謝謝。C++使用fstream從二進制文件讀取字符串

string Name = "Shaun"; 
unsigned short int StringLength = 0; 

int main() 
{ 
    StringLength = Name.size(); 

    ofstream oFile("File.txt", ios::binary|ios::out); 
    oFile.write((char*)&StringLength, sizeof(unsigned short int)); 
    oFile.write(Name.c_str(), StringLength); 
    oFile.close(); 

    StringLength = 0; 
    Name = "NoName"; 

    ifstream iFile("File.txt", ios::binary|ios::in); 
    if(!iFile.is_open()) 
     cout << "Failed" << endl; 
    else 
    { 
     iFile.read((char *)&StringLength, sizeof(unsigned short int)); 
     iFile.read((char *)&Name, StringLength); 
    } 

    cout << StringLength << " " << Name << endl; 

    system("Pause>NUL"); 
    return 0; 
} 

回答

2

這是有問題的線路。

iFile.read((char *)&Name, StringLength); 

你正在讀一std::stringchar*一部分直接進入Name內存。

您需要保存字符串的大小以及字符串的大小,以便在讀取數據時可以知道需要多少內存來讀取數據。

而不是

oFile.write(Name.c_str(), StringLength); 

你將需要:

size_t len = Name.size(); 
oFile.write(&len, sizeof(size_t)); 
oFile.write(Name.c_str(), StringLength); 

在回來的路上,你將需要:

iFile.read(&len, sizeof(size_t)); 
char* temp = new char[len+1]; 
iFile.read(temp, len); 
temp[len] = '\0'; 
Name = temp; 
delete [] temp; 
1

您需要創建一個char類型的緩衝區。

char *buffer = new char[size]; 

然後用你的緩衝區作爲參數來讀取功能

iFile.read(buffer, size); 
0

取而代之的是

iFile.read((char *)&Name, StringLength); 

試試這個:

Name.resize(StringLength); 
iFile.read((char *)&Name[0], StringLength); 

你原有線路覆蓋,而不是字符數據從一開始的字符串對象數據,其中可能包含字符串的長度和容量,例如,。此外,您也不要適當調整字符串的大小以便能夠包含數據。

相關問題