Я новичок в C ++ file 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;
}
}
и выборка данных из файла (места для удобства чтения):
000C 54686520526F6F6D6D617465 41700000
Как можновидите, первые два байта - это длина строки (в нашем случае 12), за которой следуют двенадцать символов (что означает «сосед по комнате»), а последние четыре байта являются плавающими.
Когда я бегуэтот код, единственное, что происходит, это то, что терминал зависает, и я должен закрыть его вручную.Я думаю, что это может быть потому, что я читаю за концом файла, но я понятия не имею, почему это произойдет.Что я делаю неправильно?