C_str() или reinterpret_cast лучше для работы с двоичными файлами?
Мне нужно работать с бинарными файлами в программе, и я видел, как использовался reinterpret_cast, а также c_str ().
Вот фрагмент кода с использованием c_str():
fstream aFile;
string sample = "hello this is a line of code";
aFile.open("newFile.bin", ios::out | ios::binary);
aFile.write(sample.c_str(), sample.size());
aFile.close();
Вот фрагмент кода с использованием reinterpret_cast:
fstream aFile_2;
string sample_2 = "hello this is a line of code";
aFile_2.open("newFile_2.bin", ios::out | ios::binary);
aFile_2.write(reinterpret_cast<char *>(&sample_2), sizeof(sample_2));
aFile_2.close();
И когда я записываю в двоичный файл, который использовал reinterpret_cast, я получаю тарабарщину... Когда я читаю данные обратно в мою программу, это имеет смысл. Однако когда я использую c_str (), данные имеют смысл в файле, в который я их записал (без толку).
И, после использования c_str () для записи в файл, я могу легко получить данные, используя getline или >>:
string result = "";
aFile.open("newFile.bin", ios::in | ios::binary);
//aFile >> result;
getline(aFile, result);
cout << "result = " << result << endl;
aFile.close();
Итак, мои вопросы: что лучше использовать для бинарных файлов: reinterpret_cast или c_str ()? И почему?
Лично кажется, что c_str () лучше...
Спасибо вам всем:)
2 ответа
Вопрос не имеет смысла.
Файл представляет собой поток байтов. Прежде чем вы сможете записать данные в файл, вы должны решить, как выразить эти данные в виде потока байтов. Вы должны точно решить, какая информация должна быть в файле и как она будет представлена в байтах. Это также может повлечь за собой документирование того, как вы определяете, сколько байтов необходимо прочитать, и как определяется, какая информация хранится в файле.
Затем вы можете написать код, который записывает данные в этом согласованном формате. Вы можете написать код, который читает данные, которые хранятся в этом формате.
Но вы не можете анализировать код в отсутствие понимания того, какая информация должна быть записана и как она должна быть записана. Фрагмент кода, который записывает данные, требуемые в формате, является лучшим. В буквальном смысле невозможно сказать, правильно ли записаны данные, если вы не знаете, как они будут прочитаны или какая информация должна быть записана в каком формате.
Хотя поведение aFile_2.write(reinterpret_cast<char *>(&sample_2), sizeof(sample_2));
хорошо определено, состояние std::string
объект бессмысленен вне процесса. Чтобы уточнить, это не записывает содержимое буфера, управляемого std::string
объект. Если вы хотите записать в файл бред, тогда это лучше.
aFile.write(sample.c_str(), sample.size());
записывает содержимое строкового буфера (т. е. в данном случае "привет, это строка кода"), что, как я полагаю, и есть то, что вы намереваетесь. Если так, то это лучше. Я бы лично использовал sample.data()
вместо этого, хотя это не имеет большого значения. Кроме того, я бы использовал вектор вместо std::string
представлять двоичные данные, поскольку последний предназначен для текста с нулевым символом в конце.
Что касается чтения, getline
не полезно для чтения двоичного файла. Это работает в этом случае, так как содержание является текстовым.