У меня есть несколько функций, которые я создал некоторое время назад для чтения и записи std :: strings в FILE *, открытый для чтения в двоичном режиме. Они отлично работали раньше (и WriteString() все еще работает), но ReadString() продолжает давать мне ошибки повреждения памяти во время выполнения. Строки сохраняются путем записи их размера как unsigned int перед строковыми данными как char.Чтение std :: string из двоичного файла
bool WriteString(std::string t_str, FILE* t_fp) {
// Does the file stream exist and is it valid? If not, return false.
if (t_fp == NULL) return false;
// Create char pointer from string.
char* text = const_cast<char*>(t_str.c_str());
// Find the length of the string.
unsigned int size = t_str.size();
// Write the string's size to the file.
fwrite(&size, sizeof(unsigned int), 1, t_fp);
// Followed by the string itself.
fwrite(text, 1, size, t_fp);
// Everything worked, so return true.
return true;
}
std::string ReadString(FILE* t_fp) {
// Does the file stream exist and is it valid? If not, return false.
if (t_fp == NULL) return false;
// Create new string object to store the retrieved text and to return to the calling function.
std::string str;
// Create a char pointer for temporary storage.
char* text = new char;
// UInt for storing the string's size.
unsigned int size;
// Read the size of the string from the file and store it in size.
fread(&size, sizeof(unsigned int), 1, t_fp);
// Read [size] number of characters from the string and store them in text.
fread(text, 1, size, t_fp);
// Store the contents of text in str.
str = text;
// Resize str to match the size else we get extra cruft (line endings methinks).
str.resize(size);
// Finally, return the string to the calling function.
return str;
}
У любого человека могут возникнуть проблемы с этим кодом или альтернативные предложения?
Спасибо за ответ. Причина, по которой я использую C-файл IO, - это просто потому, что я изначально писал эти функции, когда был совершенно новым для C++, и я не совсем понял все вещи iostream. Я все еще использую эти функции только из-за какого-то старого кода, который их использует (который я намереваюсь вскоре заменить). –