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 не полезно для чтения двоичного файла. Это работает в этом случае, так как содержание является текстовым.

Другие вопросы по тегам