2016-07-27 180 views
2

我想從二進制文件讀取數據到一個std :: string.Here是我第一次嘗試。讀取二進制數據到std :: string C++

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

int main(int argc, char const *argv[]) 
{ 
    fstream file("output.bin" , ios::out | ios::binary | ios::in); 
    string my_str(5, '\0'); 
    file.read(my_str.c_str(), 5); 
    cout << "String = " << my_str<< endl ; 
} 

,編譯器給了錯誤:

error: invalid conversion from ‘const char*’ to ‘std::basic_istream<char>::char_type* {aka char*}’ [-fpermissive] 
    file.read(my_str.c_str(), 5); 

據我瞭解,c_str()返回一個常量指針不能在讀的方法使用,所以我改變了我的做法有點(你可以在下面看到)。有一個更好的方法嗎 ?

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

int main(int argc, char const *argv[]) 
{ 
    fstream file("output.bin" , ios::out | ios::binary | ios::in); 
    string my_str(5, '\0'); 
    char buffer[6]; 
    file.read(buffer, 5); 
    buffer[5] = '\0'; 
    my_str = string(buffer); 

    cout << "String = " << my_str<< endl ; 
} 

PS:原諒我,如果我不能讓自己清楚,這是我第一次在這裏:)

+0

我會用'的std ::矢量'或'的std ::矢量'代替std :: string' – Slava

+0

我永遠無法理解人們爲什麼使用'std :: string'作爲二進制數據。請記住,這個容器的'value_type'是'char',這可能會導致與符號擴展有關的問題(例如,想想'my_str [3] == 0x95'的結果會是什麼)。你可能想使用'std :: vector '。 –

回答

3

在C++中11,得到一個非const指向字符串的數據的方式是:

file.read(&my_str[0], 5); 

C++ 17將引入非constdata()此,以及:

file.read(my_str.data(), 5); 
+2

這些怪癖確實讓C++變得非常棒。獲得內部字符串緩衝區的一種方便的非const方法將在35年後加入。 –

+0

可以肯定的是,在調用read方法之前,my_str的大小應該大於或等於5,對不對? @Barry –

+0

@baris_esmer當然。所有通常的注意事項都適用。 – Barry

1

另一種方式,使用標準的算法:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

int main(int argc, char const *argv[]) 
{ 
    fstream file("output.bin" , ios::out | ios::binary | ios::in); 

    auto my_str = string(); 

    copy_n(istream_iterator<char>(file), 
      5, 
      std::back_inserter(my_str)); 

    cout << "String = " << my_str<< endl ; 
} 
0

std::string是專門設計用繩子和與C風格字符串的工作一樣,所以這個事實將工作對你的這種情況。例如你的代碼:

char buffer[6]; 
file.read(buffer, 5); 
buffer[5] = '\0'; 
my_str = string(buffer); 

它有什麼問題呢?您正在讀取二進制數據,並確保那裏不會有'\ 0'字節?您可以通過修復:

my_str = string(buffer,5); 

但是這顯示了一點 - std::string作爲緩衝是不是一個好的選擇。所以你最好使用std::vector<char>甚至更​​好std::vector<uint8_t>其中有方法data()但不會隱式地從C-字符串輸出轉換爲std::ostream