Работа с бинарными файлами C++

C++   5 января 2012  Автор статьи:  
geekbrains.ru/

Для работы с бинарными файлами в C/C++ научимся пользоваться следующими функциями и опишем некоторые переменные.

int* a;// Указатель на переменную или структуру или адрес переменной или структуры, которую мы собираемся записывать в бинарный файл.

int b;//Количество байт занимаемое переменной или структурой, которую мы хотим записать.

int c;// Количество элементов, размера b.

FILE* d;//Указатель на бинарный файл или адрес бинарного файла.

fwrite(a, b, c, d);//функция для последовательной записи переменной или структуры в бинарный файл.

Примеры для базовых типов:

1)

int i=10;

int* a=&i;

int b=sizeof(i);

int c=1;//т.к у нас не массив и не что-то подобное, то мы записываем 1 раз.

FILE* d=fopen("test", "wb+");

2)

double i=10;

double* a=&i;

int b=sizeof(i);

int c=1;

FILE* d=fopen("test", "wb+");

fwrite(a, b, c, d);

Примеры со структурами и массивами структур:

1)

struct pt {

int x,y;

};

pt i;

i.x=0;

i.y=0;

pt* a=&i;

int b=sizeof(i);

int c=1;

FILE* d=fopen("test", "wb+");

fwrite(a, b, c, d);

2)

int* i=new int[10];

forn(j,10)

i[j]=j;

int b=sizeof(int);

int c=10;

FILE* d=fopen("test.dat", "wb+");

fwrite(i, b, c, d);

3)

pt i[10];

forn(j,10){

i[j].x=j;

i[j].y=j;

}

int b=sizeof(pt);

int c=10;

FILE* d=fopen("test.dat", "wb+");

fwrite(&i, b, c, d);

Для последовательного чтения из файла мы будем использовать функцию fread(a,b,c,d). У этой функции абсолютно такие же параметры. Если вы собираетесь писать и читать в файл в одном коде-программе, то не забудьте использовать функцию rewind(d); Пример для использования последовательной записи и чтения:

struct pt {

int x,y;

};

pt i[10];

forn(j,10){

i[j].x=j;

i[j].y=j;

}

int b=sizeof(pt);

int c=10;

FILE* d=fopen("test.dat", "wb+");

fwrite(&i, b, c, d);

rewind(d);

fread(&i, b, c, d);

forn(j,10){

cout<
int e;// количество байт на которое мы хотим переместиться

От начала файла        SEEK_SET

От текущей позиции     SEEK_CUR

От конца файла         SEEK_END

fseek(d, e, SEEK_SET);//функция перемещения указателя на заданное количество байт.

Пример перемещения указателя в бинарном файле на последнюю в нашем массиве структуру.

fseek(d, (c-1)*b, SEEK_SET);

Чтобы узнать на сколько байт мы уже сместились относительно начала файла воспользуемся функцией ftell(d);

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

Pascal/Delphi

Работа с бинарными файлами

  • r04

    кстати, раз речь идет о файлах в С++, то неплохо бы про fstream упомянуть, а раз о двоичных — о std::ios::binary.

    Вцелом, остальные статьи мне нравились больше. Тут куча ляпов.

    ляп подсветки синтаксиса:
    >> fread(&i, b, c, d);
    >> pt* a=&i;
    >> и еще много где

    почему ты постоянно пишешь, «переменной или структурой»? — структура, это вообще, тип данных, если хочешь. Почему не «переменной типа структуры», или «экземпляром структуры»? И еще, там не int должен быть, а size_t, вроде бы (и разницы может проявиться на каких-то архитектурах).
    >> int b;//Количество байт занимаемое переменной или структурой, которую мы хотим записать

    переменным присвоены ужасные имена (они вобще ниочем не говорят), я не сторонник венгерской нотации, но у тебя тут тоже безпридел (МБ и ничего, но ты же пишешь почти *учебник*).
    >> fwrite(a, b, c, d);

    Интересная опечатка:
    >> forn(j,10){

    И вобще, статью надо вычитать, а лучше, удалить и написать новую 🙂

    • Подсветка синтаксиса fixed. На счет ужасных имен в cpp, когда у тебя 4 строчки кода, то нет смысла давать осмысленные имена, если ты пишешь большую программу, то нужно руки оторвать, если ты так назовешь переменные. На счет опечатки это не опечатка forn(j,n) это цикл по j с 0 до n. В уроках рассказывается про это.

  • Вадим

    Ужасная статья . Такую непростую тему очень сложно уместить в несколько строчек. У Вас же примеры не выразительные, да и объяснение не лучше. Если бы я не был знаком с материалом, то вряд ли бы понял Вас.

    • Если был знаком с материалом, то зачем читал? Предложи более выразительные примеры. Что в этой теме непростого? По моему проще только 2*2. Ляпы есть, и их много везде, надо исправлять.

Научиться программировать

  • на Delphi

  • на Java

  • на C++

geekbrains.ru/
geekbrains.ru/