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个字符(其拼写"室友")的长度,和最终四个字节是一个浮子.
当我运行此代码时,唯一发生的事情是终端挂起,我必须手动关闭它.我想这可能是因为我正在阅读文件的结尾,但我不知道为什么会这样.我做错了什么?
至少有两个问题.一,行:
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支持非常差.幸运的是,有解决方案.
| 归档时间: |
|
| 查看次数: |
2190 次 |
| 最近记录: |