Я сделал программу, как показано ниже
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<fstream.h>
void main() {
char name[24];
cout << "enter string :";
gets(name);
ofstream fout;
fout.open("bin_data",ios::out|ios::binary);
fout.write((char*)&name,10);
fout.close();
}
Но когда я открываю файл bin_data с помощью блокнота, я обнаруживаю, что строка сохраняется в текстовом формате, а не в двоичном виде …… Пожалуйста, помогите …
Этот код может сохранить слово 10 символов.
Но когда я компилирую этот код с помощью Turbo C ++ v4.5, я нахожу это. Когда я ввожу слово из 1 или 2 букв, оно сохраняется в текстовом формате (игнорируя значение мусора), но когда я вводю слово длиной от 3 до 7 букв, оно сохраняется в двоичном формате. и в 9 и 10 буквенное слово снова в текстовом формате ….. Кто-нибудь может сказать мне причину …?
Пожалуйста, скомпилируйте и запустите программу, как я упоминал выше, и ответьте
Ваши данные содержат только текст. Он представлен одинаковыми битами как в текстовом, так и в двоичном формате.
Двоичный формат означает, что ваши данные записываются в файл без изменений. Если бы вы использовали текстовый формат, некоторые нетекстовые символы были бы изменены. Например, байт 10 (который представляет новую строку) может быть изменен на новую строку, специфичную для операционной системы (два байта, 15 и 10 в Windows).
Для двоичных значений текстовых символов см. http://www.asciitable.com/
Ваш второй пример имеет переполнение буфера.
char name[24];
fout.write((char*)&name,10);
Вы резервируете 24 байта данных, которые заполнены случайными байтами, которые оказываются в этой точке памяти. Когда вы сохраняете 2-символьную строку в буфере, она перезаписывает только первые три байта. Третий байт имеет значение 0, которое говорит вам, что текст заканчивается в этой точке. Если бы вы вызвали функцию strlen (), она бы указала количество символов перед первым 0 байтом.
Если ваш ввод представляет собой двухсимвольный текст, и вы решили записать 10 байтов из буфера, 7 байтов в конце заполнены неверными данными. Обратите внимание, что это не вызывает нарушения прав доступа, поскольку вы зарезервировали данные для 24 байтов.
Смотрите также: https://en.wikipedia.org/wiki/Null-terminated_string
Других решений пока нет …