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 回答
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将是一个更好的选择。你可以在这里阅读更多关于它的信息

于 2012-11-28T18:59:54.100 回答
1

请查看以下有关 c_str 的内容,以了解您的程序有哪些问题。一些问题包括 c_str 不可修改,而且它返回一个指向您的字符串内容的指针,但您从未初始化字符串。

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

至于解决它......你可以尝试读入一个 char* ,然后从中初始化你的字符串。

于 2012-11-28T18:55:46.540 回答
1

不它不是。std::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 回答