C_str () или reinterpret_cast лучше для работы с двоичными файлами? - PullRequest
0 голосов
/ 23 января 2019

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

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 ]

0 голосов
/ 23 января 2019

Вопрос не имеет смысла.

Файл представляет собой поток байтов.Прежде чем вы сможете записать данные в файл, вы должны решить, как выразить эти данные в виде потока байтов.Вы должны точно решить, какая информация должна быть в файле и как она будет представлена ​​в байтах.Это также может повлечь за собой документирование того, как вы определяете, сколько байтов необходимо прочитать, и как определяется, какая информация хранится в файле.

Затем вы можете написать код, который записывает данные в этом согласованном формате.Вы можете написать код, который считывает данные, хранящиеся в этом формате.

Но вы не можете анализировать код без понимания того, какая информация должна быть записана и как она должна быть записана.Фрагмент кода, который записывает данные, требуемые в формате, является лучшим.В буквальном смысле невозможно сказать, правильно ли записаны данные, если вы не знаете, как они будут читаться или какая информация должна быть записана в каком формате.

0 голосов
/ 23 января 2019

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

...