2012-11-28 138 views
2

像往常一樣,指針問題。這次我想讀取一個文件(以二進制模式打開)並將其一部分存儲在一個std :: string對象中。 讓我們看看:C++ fread()轉換成std :: string

FILE* myfile = fopen("myfile.bin", "rb"); 
if (myfile != NULL) { 
    short stringlength = 6; 
    string mystring; 
    fseek(myfile , 0, SEEK_SET); 
    fread((char*)mystring.c_str(), sizeof(char), (size_t)stringlength, myfile); 
    cout << mystring; 
    fclose(myfile); 
} 

這可能嗎?我沒有收到任何消息。我相信這個文件是O.K.當我嘗試使用char *時,它確實可行,但我想將它直接存儲到字符串中。謝謝你的幫助!

+4

豬頭...你從c_str得到()是不可變... –

+0

註釋上方並回答以下都是正確的,但如果你使用的是C++,你爲什麼要使用文件I C成語/ O –

+2

,並將它關閉,C++流式傳輸以供後續輸出。 –

回答

4

設置字符串足夠大第一避免緩衝區溢出,並訪問字節數組作爲&mystring[0]滿足conststd::string其他要求。

FILE* myfile = fopen("myfile.bin", "rb"); 
if (myfile != NULL) { 
    short stringlength = 6; 
    string mystring(stringlength, '\0'); 
    fseek(myfile , 0, SEEK_SET); 
    fread(&mystring[0], sizeof(char), (size_t)stringlength, myfile); 
    cout << mystring; 
    fclose(myfile); 
} 

有這個代碼很多很多的問題,但認爲是最小調整正確使用std::string

1

請查看以下有關c_str的信息,以查看您的程序有哪些錯誤。一些問題包括c_str不可修改,但它也返回一個指向你的字符串內容的指針,但你從未初始化過字符串。

http://www.cplusplus.com/reference/string/string/c_str/

至於解決它......你可以嘗試讀入一個char *,然後初始化從你的字符串。

3

string::c_str()返回const char*你不能修改。

這樣做的一種方法是先使用char *並從中構造一個字符串。

char buffer = malloc(stringlength * sizeof(char)); 
fread(buffer, sizeof(char), (size_t)stringlength, myfile); 
string mystring(buffer); 
free(buffer); 

但話又說回來,如果你想有一個字符串,你或許應該問自己Why am I using fopen and fread in the first place??

fstream將是一個更加更好的選擇。 您可以閱讀更多關於它here

+0

數組長度必須是常數。 C++沒有可變長度數組。 –

+0

我看到了,謝謝指出:) –

+0

修復了我的答案.. –

1

不,它不是。 std::string::c_str()方法不會返回可修改的字符序列,因爲您可以從here進行驗證。更好的解決方案是使用緩衝區數組。下面是一個例子:

FILE* myfile = fopen("myfile.bin", "rb"); 
    if (myfile != NULL) { 
     char buffer[7]; //Or you can use malloc()/new instead. 
     short stringlength = 6; 
     fseek(myfile , 0, SEEK_SET); 
     fread(buffer, sizeof(char), (size_t)stringlength, myfile); 
     string mystring(buffer); 
     cout << mystring; 
     fclose(myfile); 
     //use free() or delete if buffer is allocated dynamically 
} 
2

我會推薦這是做這種事情的最佳方式。你也應該檢查以確保所有的字節都被讀取。

FILE* sFile = fopen(this->file.c_str(), "r"); 

    // if unable to open file 
    if (sFile == nullptr) 
    { 
     return false; 
    } 

    // seek to end of file 
    fseek(sFile, 0, SEEK_END); 

    // get current file position which is end from seek 
    size_t size = ftell(sFile); 

    std::string ss; 

    // allocate string space and set length 
    ss.resize(size); 

    // go back to beginning of file for read 
    rewind(sFile); 

    // read 1*size bytes from sfile into ss 
    fread(&ss[0], 1, size, sFile); 

    // close the file 
    fclose(sFile);