Какъв двоичен файл. Записване и четене на персонализирани типове данни в двоични файлове

Описание и вътрешно представяне на файлове

Файловете са различни един от друг. Всички файлове, съхранявани на компютъра, имат специални атрибути, т.е. специални методи за описание за разграничаване на един файл от друг: 1) име; размер 2; 3) дата и час; 4) икона.

Всеки файл има име - името на файла. Името на файла описва съдържанието му или подсказва за какво може да се използва. Името се присвоява на файла, когато е създаден. Това се отнася за всички файлове.

Всеки файл има физически размер. Файлът заема известно количество компютърна памет и известно количество дисково пространство.

В момента на създаване на файла, операционната система го отпечатва с датата и часа на създаване. Това ви позволява да сортирате файлове по дата и час и по този начин да подреждате нещата в компютъра си. Датата и часът, когато файлът е бил актуализиран или променен също се отбелязва.

Всеки файл е от определен тип, тясно свързан с иконата на файла, която виждаме. Типът на файла зависи от съдържанието му. Всяка програма присвоява определен тип и подходяща икона на създадения документ.

Размерът на файла се измерва в байтове, точно както обемът на паметта.

Размерът на файла може да бъде 0 байта, което означава, че файлът съществува, но не съдържа нищо. S Максималният размер на файла е 4 GB. Но такива огромни файлове са много редки.

Вграденият компютърен часовник е необходим по-специално за задаване на часа и датата на тяхното създаване на файловете. Това обяснява колко е важно да настроите този часовник правилно. Има и допълнителни атрибути за описание на файлове, като системни файлове, скрити файлове, файлове само за четене, архивни файлове и др. Операционната система ще го разбере сама.

Всеки файл има уникален индекс. Индексът съдържа информацията, която всеки процес има нужда за достъп до файла. Обработва файлове за достъп, като използва добре дефиниран набор от системни повиквания и идентифицира файла с низ от знаци, които действат като отличително име на файл. Всяко отличително име идентифицира уникално файл, така че ядрото превежда това име в индекс за файла. Индексът включва таблица с адреси за местоположението на информацията за файла на диска. Тъй като всеки блок на диска се адресира със собствен номер, тази таблица съхранява колекция от номера на дискови блокове. За гъвкавост ядрото добавя парчета към файл наведнъж, позволявайки информацията за файла да бъде разпръсната из цялата файлова система. Но това оформление усложнява задачата за намиране на данни. Адресната таблица съдържа списък с номера на блокове, съдържащи информация, принадлежаща към файла, но простите изчисления показват, че линейният списък с файлови блокове в индекса е труден за управление. За да може малката индексна структура да побере големи файлове, адресната таблица на дисковия блок е подравнена със структурата.

Текстови и двоични файлове

Файловете позволяват на потребителя да чете големи количества данни директно от диска, без да ги въвежда от клавиатурата. Има два основни типа файлове: текстови и двоични.

Текстфайлове, състоящи се от произволни знаци, се извикват. Те са организирани в редове, всеки от които завършва с " край на реда". Краят на самия файл е обозначен със символа " край на файла "... Когато записвате информация в текстов файл, който може да бъде прегледан с всеки текстов редактор, всички данни се преобразуват в символен тип и се съхраняват под формата на знаци.

В двоично NSфайловеинформацията се чете и записва под формата на блокове с определен размер, в които могат да се съхраняват данни от всякакъв вид и структура.

За работа с файлове се използват специални типове данни, наречени потоци. Ifstream се използва за работа с файлове в режим на четене, а ifstream е в режим на запис. Потокът ifstream се използва за работа с файлове в режим на писане и четене.

В програмите на C ++, когато работите с текстови файлове, трябва да включите библиотеките ifstream и iostream.

За да запишете данни в текстов файл, трябва: 1) опишете променлива от тип извън потока отворен; 3) извеждане на информация във файл; 4) не забравяйте да затворите файла.

За да прочетете данни от текстов файл, трябва:

1) опишете променлива от тип ifstream; 2) отворете файла с помощта на функцията отворен; 3) четене на информация от файла; при четене на всяка част от данни е необходимо да се провери дали е достигнат края на файла; 4) затворете файла.

Трябва да се отбележи, че във всички разгледани по-горе примери функцията fopen () в режимите “r” и “w” отваря текстов файл за четене и запис съответно. Това означава, че някои знаци за форматиране на текст, като връщане на карета '\ r', не могат да се четат като отделни знаци, независимо как съществуват във файла, но те са там. Това е характеристика на текстовия режим на файла. За по-фина работа със съдържанието на файловете има двоичен режим, който представя съдържанието на файла като последователност от байтове, където всички възможни контролни кодове са само числа. В този режим е възможно да премахвате или добавяте контролни знаци, които не са налични в текстов режим. За да отворите файл в двоичен режим, функцията fopen () също се използва с последния параметър равен на „rb“ и „wb“ съответно за четене и запис.

Двоичен файл е всеки файл на вашия компютър. Цялата информация на компютър и свързани носители се записва в битове (оттук и името). Въпреки това, за сравнение, текстов файл може да се чете в четците, съответстващи на разширението (най-простите - дори в Notepad), но изпълнимият файл не може. И въпреки че всъщност txt файлът е същият двоичен файл, когато се говори за проблема с отварянето на съдържанието на двоични файлове, те имат предвид изпълними файлове, както и компресирани данни.

Ще имаш нужда

  • - Програма Hex Edit.

Инструкции

  • Изтеглете програмата Hex Edit на твърдия диск - файлов редактор, който представя съдържанието им в двоична форма. Отворете програмата, като щракнете двукратно върху стартовия файл. Този софтуер ви позволява да четете двоични файлове в реално време, да променяте съдържание, да добавяте свои собствени записи и много други. За да работите правилно в тази среда, трябва да знаете малко за общите концепции на двоичните файлове.
  • Прозорецът на програмата не се различава много от обичайния редактор: познатото меню и панел с бутони, тялото на редактирания файл, отметки и лентата на състоянието. Отворете двоичния файл през менюто Файл или като щракнете върху съответната икона на панела. Двоичният файл ще се появи пред вас като низове с цифри и букви. Не бъркайте тези знаци с данни за печат в текстови файлове. Те също могат да бъдат редактирани чрез изтриване на символи, но това ще изтрие клетки с данни, части от файла.
  • Направете промени в съдържанието на файла. Приложението може да показва важни части от файла за по-лесно търсене, а също така има гъвкава конфигурация на графичния дисплей на двоичния код. Превключете изгледа на съдържанието към режим ASCII + IBM / OEM, за да видите програмния код на файла. Ако въведете грешни редове във файла, той може да не работи правилно, което ще доведе до сериозни последици за операционната система на персоналния компютър.
  • Запазете промените си. Ако нямате опит в редактирането на файлове по този начин, бъдете готови файлът да не се отваря и да откаже да работи след извършване на промени. Най-вероятно ще объркате няколко копия, преди да свършите работата. Опитайте се да не запазвате всички промени в оригиналния файл, така че съдържанието му да остане непроменено.
  • записи), тогава желанието по някакъв начин да се намали неизползваното, но заето място в паметта е напълно разбираемо.

    Специално за такива случаи има записи с вариантна част.

    Описание на запис с вариантна част

    В раздела var запис с вариантна частописват както следва:

    вар<имя_записи>: запис<поле1>: <тип1>; [<поле2>: <тип2>;] [...] случай<поле_переключатель>: <тип>на<варианты1>: (<поле3>: <тип3>; <поле4>: <тип4>; ...); <варианты2>: (<поле5>: <тип5>; <поле6>: <тип6>; ...); [...] край;

    Невариантна частнотацията (пред ключовата дума case) се подчинява на същите правила като обикновената нотация. Най-общо казано, невариантната част може да отсъства изобщо.

    Вариантна частзапочва със запазения регистър на думата, след което се посочва полето на записа, което допълнително ще служи като превключвател. Както при обикновен оператор case, превключвателят трябва да принадлежи на един от изброени типоведанни (вж. Лекция 3). Списъкът с възможности за избор може да бъде константа, диапазон или обединение от множество константи или диапазони. Наборът от полета, които трябва да бъдат включени в структурата на записа, ако е изпълнена съответната опция, е затворен в скоби.

    Пример... За да се опише съдържанието на библиотеката, е необходима следната информация:

    Колоните „Заглавие“ и „Издател“ са общи и за трите опции, а останалите полета зависят от вида на печатното издание. За да приложим тази структура, ще използваме вписване с вариантна част:

    тип biblio = име на записа, издател: низ; случай: символ на "b": (автор: низ; година: 0..2004); "n": (данни: дата); "m": (година: 1700..2004; месец: 1..12; номер: цяло число); край;

    В зависимост от стойността на полето за елемент, записът ще съдържа 4, 5 или 6 полета.

    Механизмът за използване на запис с вариантна част

    Броят байтове, разпределени от компилатора за запис с вариантна част, се определя от неговата "най-дълга" версия. По-късите набори от полета от други варианти заемат само част от разпределената памет.

    В горния пример "най-дългата" опция е "b": тя изисква 23 байта (21 байта за низ и 2 байта за цяло число). За опции "n" и "m" са необходими съответно 4 и 5 байта (виж таблицата).

    име, издател вещ Вариантна част
    ... "б" автор година
    ... "н" данни
    ... "м" година месец номер
    ... "б" автор година

    Двоични файлове

    Двоичните файлове съхраняват информация във вида, в който е представена в паметта на компютъра, и следователно са неудобни за хората. Вглеждайки се в такъв файл, е невъзможно да се разбере какво е написано в него; не може да се създаде или коригира ръчно - в някакъв текстов редактор - и т.н. Всички тези неудобства обаче се компенсират от скоростта на работа с данни.

    Освен това текстовите файлове принадлежат към структури последователен достъп, а двоичен - директен. Това означава, че по всяко време можете да се обърнете към всеки, не само към текущия елемент.

    Работа с двоични файлове

    Цялата информация се съхранява в компютъра под формата на 0 и 1, тоест в двоична форма. Двоичните файлове се различават от текстовите само по начина, по който работят с тях. Например, ако запишем числото "4" в текстов файл, тогава то се записва като символ и е необходим един байт за съхраняването му. Съответно размерът на файла ще бъде равен на един байт. Текстовият файл, съдържащ записа "145687", ще бъде с размер шест байта.

    Ако запишем цялото число 145687 в двоичен файл, тогава той ще има размер от четири байта, тъй като точно това е необходимо за съхраняване на данни от тип int. Тоест двоичните файлове са по-компактни и в някои случаи по-лесни за обработка.

    Записване на стандартни типове данни в двоични файлове

    За да отворите двоичен файл, трябва да зададете режима на достъп на ios :: binary (в някои C++ компилатори - ios :: bin).

    За да създадете изходен файл, създайте обект:

    ofstream outBinFile ("out.bin", ios :: out | ios :: двоичен);

    /* създаване на обект на класизвън потока навън. кошче

    ако (! out_f і 1) // стандартна проверка

    Данните се записват с помощта на метода write (), който има два параметъра: първият е указател към началото (адреса на началото) на данните, които се записват, вторият е броят на байтовете за запис. В този случай указателят трябва да бъде изрично преобразуван в типа char.

    Пример 1.Запишете променливи от различни типове в двоичен файл:

    ofstream outBinFile ("test.bin", ios :: out I

    ios:: двоичен); / ^ създаване на обект на класна потока и се опитва да го свърже с файлатест. кошче в двоичен режим на запис * /

    int a - 145687; // деклариране на целочислена променливаа

    outBinFi le. напишете ((char *) & a, sizeof (a)); / ^ запис във файл

    променливаа като поток от байтове, т.е. записване във файл на вътрешното представяне на целочислена променлива a * / float x - 123,25; // декларация на реална променлива NS

    outBinFile .write ((char *) & x, sizeof (x)); / ^ запис във файл

    променлива NS като поток от байтове, т.е. запис във файл на вътрешното представяне на целочислена променлива x * /

    // дефиниране на символна променливас и го инициализирате със символа g outBinFile.write ((char *) & c, sizeof (c));

    // напишете символж да подадете

    outBinFile.close (); връщане на 0;

    Ако отворите съдържанието на тестовия .bin файл с текстов редактор, то ще изглежда така:

    и размерът на файла е 9 байта.

    Четене на стандартни типове данни от двоични файлове

    За да отворите съществуващ двоичен файл за четене, трябва да създадете обект:

    ifstream inpBinFile ("inp.bin", ios :: в I ios :: двоичен);

    /* използваме разделяне на флагове, което показва, че файлът е отворен за четене в двоична форма * /

    ако (! inpBinFile)

    cout За да четете данни, използвайте функцията read (), която има параметри, подобни на функцията write ().

    #include с помощта на пространство от имена std; int main ()

    ifstream inpBinFile ("test.bin", ios :: в I

    ios:: двоичен); / / отворете файла за четене в двоичен вид

    int a; float x; char с = "g";

    inpBinFile.read ((char *) & a, sizeof (a));

    // четене на целочислена променлива inpBinFile.read ((char *) & x, sizeof (x));

    // четене на реална променлива inpBinFile.read ((char *) & c, sizeof (c));

    // четене на символна променлива

    inpBinFile.close (); cout

    Резултатът от програмата:

    a = 145687 x = 123,25 c = g

    Имайте предвид, че не се осъществява преобразуване на информация при използване на функциите за запис и четене. Вътрешното представяне на данните се записва и чете във файла. Ето защо предишните две програми дадоха правилния резултат.

    Записване и четене на персонализирани типове данни в двоични файлове

    За разлика от текстовите файлове, работата с персонализирани типове данни с помощта на двоични файлове не се различава от стандартните типове данни. Методите write () и read () се използват по подобен начин. Програмистът трябва само да посочи адреса на областта на паметта, която ще бъде записана, и броя на байтовете, които трябва да бъдат записани, като вземе предвид, че не се извършва преобразуване на данни, а само вътрешното представяне на информацията се записва и чете.

    Също така, когато работите с двоични файлове, могат да се използват методите seekg (), tellg (), seekp (), tellp ().

    Пример 3.Напишете програма, която записва информация за група туристи в двоичен файл.

    fstream BinFile ("ankety.bin", ios :: в I ios :: out | ios :: двоичен);

    Anketa Gruppa =; за (int i = 0; i

    BinFile.write ((char *) & Gruppa [i], sizeof (Anketa)); BinFile.close (); връщане на 0;

    Пример 4.Файлът "ankety.bin" съдържа данни за група туристи, необходимо е да ги прочетете и да ги изведете.

    #include с помощта на пространство от имена std; структура Анкета (

    char име; int възраст;

    структуриран тип данниАнкета към екрана * /

    ostream & оператор

    fstream BinFile ("ankety.bin", ios :: in | ios :: out | ios :: двоичен); ако (! BinFile)

    за (int i = 0; i

    // незабавно прочете всички байтове, заети от променливата тип Anketa BinFile.read ((char *) & Gruppa [i], sizeof (Anketa));

    BinFile.close (); връщане на 0;

    Резултатът от програмата:

    Иванов, 23 Сидоров, 21 Петров, 22

    Натиснете произволен клавиш, за да продължите. ... ...

    Разработване на собствени класове за работа с файлове

    Неудобно е постоянно да използвате методите write () и read (), много по-приятно е да можете да използвате операциите ">" по аналогия с текстовите файлове. Нека дадем пример за внедряване на нашия клас за работа с двоични файлове.

    използване на пространство от имена std;

    структура Анкета // декларира структура за съхранение на информация

    / * претоварване на операцията за вмъкване на поток за потребителски изход

    структуриран тип данниАнкета към екрана * /

    ostream & оператор

    клас outBinaryFile: публичен на stream / ^ дефинираме нашия собствен клас за работа с изходни двоични файлове. Генерираме го от класа за работа с изходни файлови потоци * /

    / * когато описвате конструктора на генерирания клас, не забравяйте да извикате конструктора на базовия клас, като му предадете необходимите параметри * /

    outBinaryFile (char * име): ofstream (име, ios :: out I ios :: двоичен)

    // претоварване на необходимите операции като методи на клас outBinaryFile & оператор

    напишете ((char *) & chislo, sizeof (chislo)); върнете * това;

    outBinaryFile & оператор

    напишете ((char *) & ank, sizeof (ank)); върнете * това;

    клас inpBinaryFile: публичен ако поток / * дефинираме нашия клас за работа с входни двоични файлове. Генерираме го от класа за работа с входни файлови потоци * /

    inpBinaryFile (char * име): ifstream (име, ios :: в I ios :: двоичен)

    / * извикване на конструктора на базовия клас с необходимите параметри,

    достатъчно за конструктора на извлечения клас * /

    // претоварване на необходимите операции

    inpBinaryFile & оператор >> (int & chislo)

    прочетете ((char *) & chislo, sizeof (chislo)); върнете * това;

    inpBinaryFile & оператор >> (Anketa & ank)

    прочетете ((char *) & ank, sizeof (ank)); върнете * това;

    int a = 111, b = 112; outBinaryFile outFile ("dannye.bin");

    // отваряне на файла за четене

    inpBinaryFile inpFile ("dannye.bin"); ако (! inpFile)

    за (int і = 0; i

    inpFile >> a; // четене на въпросника от файла

    cout // и го изведете на екрана

    inpFile >> anketa; cout

    Резултатът от програмата:

    Коля 1990, 582-78-95.

    Натиснете произволен клавиш, за да продължите. ... ...

    1. Възможно ли е да се използва операция в програмата?

    ios :: в I ios :: out

    • а) да, във всеки случай;
    • б) да, но само при работа с текстови файлове;
    • в) не, във всеки случай.
    • 2. Посочете правилната опция за отваряне на текстов файл за четене:
      • a) ifstream inpF ("input.txt", ios :: in);
      • б) ifstream inpF ("input.txt", ios :: вход);
      • в) ifstream inpF (ios: in, "input.txt").

    H. Какво ще се покаже в резултат на изпълнение на следния код?

    inputFile.get (c);

    следващ - inputFile.peek ();

    ако (следващ == EOF)

    • а) съдържанието на файла, свързан с потока inputFile, ще се покаже веднъж;
    • б) съдържанието на файла, свързан с потока inputFile, ще се показва на екрана безкраен брой пъти;
    • в) нищо няма да се показва на екрана.
    • 4. Колко знака има във файла?
    • 12 3 4 5 6
    • а) 6;
    • б) 7;
    • в 11.
    • 5. Какви методи могат да се използват за определяне на края на файла?
    • а) eof ();
    • б) добър ();
    • в) и двата метода.
    • 6. За какво е функцията getline ()?
    • а) чете дума от файл;
    • б) чете цялото съдържание на файла;
    • в) чете ред от файл.
    • 7. За да запишете/четете персонализирани типове данни във файл, трябва:
      • а) претоварване на операциите ">>" и "
      • б) писането и четенето на персонализирани типове данни са достъпни без допълнителни действия;
      • в) запис и четене на дефинирани от потребителя типове данни във файл не е възможно.
    • 8. Какви функции се използват за запис/четене на информация в двоичен вид?
    • а) printf / scanf;
    • б) пишете / четете;
    • в) сложи/получи.
    • 1. Напишете програма, която записва букви от английската азбука във файл.
    • 2. Файлът input.txt съдържа информация от няколко текстови реда. Покажете съдържанието на този файл на екрана, пребройте броя на редовете във файла.
    • 3. Дискът съдържа файла result.txt с резултатите от химически експерименти. Напишете програма, която създава копие на този файл с име copy_resylt.txt.
    • 4. Въведете името на файла с помощта на клавиатурата. В посочения файл изтрийте всички четни редове.
    • 5. Напишете програма, която в текстов файл замества всички малки букви с главни и обратно.
    • 6. Оригиналният текстов файл съдържа числа, разделени с интервали. Генерирайте два нови файла: първият трябва да съдържа само четни числа, а вторият - нечетни.
    • 7. Реални числа се записват във файла. Напишете програма, която отхвърля дробната част от тези числа и ги записва в нов файл.
    • 8. Текстовият файл съдържа информация за полетите на авиокомпанията. Изберете от тези данни полети, заминаващи следобед и ги покажете на екрана.
    • 9. Оператори за претоварване >> и
    • 10. Напишете свой собствен клас за работа с двоични файлове.
    • 11. Напишете списък от 10 членове на класа в текстов файл и в двоичен файл. Сравнете тези файлове. Обяснете получената разлика.
    • 12. Разработете клас, който записва информация за автомобили във файл (година на производство, марка, цвят и т.н.) в текстов файл. В този случай всеки символ на информация се заменя със собствен ABO 1-код. Покажете получения файл на екрана.

    Контролни въпроси

    • 1. Какви класове се използват за работа с файлови потоци?
    • 2. Какви режими на достъп могат да се използват при работа с файлове? Дай примери.
    • 3. Какъв метод се използва за отваряне на файла? Дай примери.
    • 4. Какви операции са налични за работа с файлове? Какви функции има за тези операции?
    • 5. Какви методи ви позволяват да определите края на файла, когато четете информация от него? Каква е разликата между тези методи? Дай примери.
    • 6. Как можете да четете променливи от стандартни типове данни от текстови файлове?
    • 7. Могат ли дефинирани от потребителя променливи от тип данни да се четат от текстови файлове?
    • 8. Какви функции са предназначени за произволно четене на информация от файл? Дай примери.
    • 9. Какви са характеристиките на двоичните файлове? Какви са предимствата от използването на такива файлове?
    • 10. Какви функции могат да се използват за запис/четене на информация в двоични файлове?
    • 11. Как да чета променливи от стандартни типове данни от двоичен файл?
    • 12. Какви съображения трябва да имате предвид, когато четете персонализирани типове данни от двоични файлове?
    • "Иванов", 23), ("Сидоров", 21),

    Много хора често имат въпрос как да отворят двоичен файл. Този документ е всеки файл, който се намира на персонален компютър. Всички данни, които са на компютри и свързани с тях носители, обикновено се записват в битове. От тази дума идва и името. Ако дадем обикновен текстов файл за сравнение, тогава няма да има проблеми с неговото четене. За да направите това, достатъчно е да имате обикновен редактор на компютъра си, дори бележник ще свърши работа. За да отворите двоичен файл, не можете да направите с обикновен бележник. И ако говорим за факта, че информацията на текстовите файлове е криптирана със същите битове, тогава обикновено, когато се говори за четене на двоични файлове, те имат предвид изпълними документи.

    Инструкции за действие

    Първо, софтуерен инструмент, наречен HexEditor, който е прост редактор за двоични файлове, трябва да бъде инсталиран на твърдия диск на персоналния компютър. След инсталирането програмата трябва да се отвори чрез двукратно щракване върху иконата. Този инструмент ще ви позволи да четете двоичен файл в реален режим. В този случай можете да промените данните във файла, да добавите своя собствена информация и т.н. За да работите в този редактор и да променяте двоичния файл, трябва да имате поне известни познания в тази област на дейност.

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

    На трето място, с помощта на програмата можете да опитате да промените всяка част от документа. Както споменахме по-рано, инструментът показва файла по начин, който подобрява начина, по който намирате частта от документа, която търсите. Освен това програмата има доста гъвкава настройка. Може да се използва за промяна на графичното изобразяване на двоичния код, който има двоичният файл. В случай, че в някаква част от файла бъдат въведени неверни данни, впоследствие той може или напълно да спре да работи, или да не започне да работи съвсем правилно. Във всеки случай въвеждането на такива данни ще предизвика промени както в операционната система, така и директно в самия персонален компютър.

    Четвърто, след промяна, изтриване или добавяне на определени данни във файла, трябва да запазите резултата от работата си. В случай, че нямате достатъчно опит в редактирането на файлове, тогава трябва да сте подготвени за не съвсем приятни последици. Например, документ може да спре да работи след промяна на данните. Докато не започнете да разбирате добре този проблем, много копия на файлове ще бъдат повредени. Ако не сте сигурни в своите възможности, тогава не трябва да променяте данните сами, особено в ситуации, когато трябва да коригирате двоичния файл su.