从文件中读取值时,垃圾附加到输出

Met*_*eta 0 c++ file-io stream

我是C++文件io的新手,所以前几天我决定编写一个小程序,只读取一个UTF-8编码的字符串和一个二进制文件中的配对浮点数.模式是字符串浮点数,没有额外的数据或对之间的间距.编辑我已根据几个答案修改了代码.但是,输出保持不变("RoommateAp 0");

string readString (ifstream* file)
{
    //Get the length of the upcoming string
    uint16_t stringSize = 0;
    file->read(reinterpret_cast<char*>(&stringSize), sizeof(char) * 2);

    //Now that we know how long buffer should be, initialize it
    char* buffer = new char[stringSize + 1];
    buffer[stringSize] = '\0';

    //Read in a number of chars equal to stringSize
    file->read(buffer, stringSize);
    //Build a string out of the data
    string result = buffer;

    delete[] buffer;
    return result;
}

float readFloat (ifstream* file)
{
    float buffer = 0;
    file->read(reinterpret_cast<char*>(&buffer), sizeof(float));
    return buffer;
}

int main()
{
    //Create new file that's open for reading
    ifstream file("movies.dat", ios::in|ios::binary);
    //Make sure the file is open before starting to read
    if (file.is_open())
    {
        while (!file.eof())
        {
            cout << readString(&file) << endl;
            cout << readFloat(&file)  << endl;
        }
        file.close();
    }
    else
    {
        cout << "Unable to open file" << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及来自文件的数据样本(可读性空间):

000C 54686520526F6F6D6D617465 41700000
Run Code Online (Sandbox Code Playgroud)

如可以看到的,前两个字节是串(12在这种情况下),其后的12个字符(其拼写"室友")的长度,和最终四个字节是一个浮子.

当我运行此代码时,唯一发生的事情是终端挂起,我必须手动关闭它.我想这可能是因为我正在阅读文件的结尾,但我不知道为什么会这样.我做错了什么?

Fré*_*idi 5

至少有两个问题.一,行:

file->read(reinterpret_cast<char*>(stringSize), sizeof(char) * 2);
Run Code Online (Sandbox Code Playgroud)

可能应该采取以下地址stringSize:

file->read(reinterpret_cast<char*>(&stringSize), sizeof(stringSize));
Run Code Online (Sandbox Code Playgroud)

二,行:

char* buffer = new char[stringSize];
Run Code Online (Sandbox Code Playgroud)

没有分配足够的内存,因为它没有考虑NUL终结器.该代码应该执行以下操作:

//Now that we know how long buffer should be, initialize it
char* buffer = new char[stringSize + 1];
//Read in a number of chars equal to stringSize
file->read(buffer, stringSize);
buffer[stringSize] = '\0';
Run Code Online (Sandbox Code Playgroud)

最后,行:

return static_cast<string>(buffer);
Run Code Online (Sandbox Code Playgroud)

delete[]实例化之后失败到缓冲区string,这将导致内存泄漏.

另请注意,std::string开箱即用的UTF-8支持非常差.幸运的是,有解决方案.