5

いつものように、ポインターの問題。今回は、(バイナリ モードで開かれた) ファイルを読み取り、その一部を 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 );
}

これは可能ですか?メッセージが届きません。ファイルは問題ないと確信しています char* を試してみると動作しますが、文字列に直接保存したいと思います。ご協力いただきありがとうございます!

4

5 に答える 5

13

最初に、バッファ オーバーランを回避するのに十分な大きさの文字列を設定し、およびその他の要件&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です。

于 2012-11-28T19:02:45.167 に答える
6

そのようなことを行うための最良の方法としてこれをお勧めします。また、すべてのバイトが読み取られたことを確認する必要があります。

    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);
于 2016-07-27T21:35:37.580 に答える
1

いいえそうではありません。herestd::string::c_str()から検証できるように、メソッドは変更可能な文字シーケンスを返しません。より良い解決策は、バッファ配列を使用することです。以下に例を示します。char

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
}
于 2012-11-28T19:01:37.177 に答える
1

c_str に関する次の項目をチェックして、プログラムの問題点を確認してください。いくつかの問題には、c_str が変更可能でないこと、文字列の内容へのポインタを返すこと、文字列を初期化していないことが含まれます。

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

それを解決するには... char* に読み込んでから、そこから文字列を初期化してみてください。

于 2012-11-28T18:55:46.540 に答える