Чтение и запись бинарных файлов


Работа с бинарными файлами производится посредством посимвольного чтения-записи.

Для чтения одного символа применяется функция getc() (функция fgetc() аналогична). Она имеет следующий прототип:

1
int getc(FILE *stream);
В качестве параметра в функцию передается указатель на файловый поток, а возвращаемым значением является считанный из файла символ, точнее его числовой код.

Для записи символа в файл применяется функция putc(), которая имеет следующий прототип:

1
int putc(int c, FILE *stream);
В качестве параметров в функцию передаются указатель на файловый поток и символ, который надо записать. Результатом функции является записанный символ.

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

Применим эти функции в программе:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>

int write(char * filename, char message[], int n);
int read(char * filename);

int main(void)
{
char hello[] = "hello world!";
char * filename = "D://data.txt";

int n = sizeof(hello)/sizeof(hello[0]);

write(filename, hello, n);
read(filename);

return 0;
}

int write(char * filename, char message[], int n)
{
FILE * fp;
if((fp= fopen(filename, "w"))==NULL)
{
perror("Error occured while opening file");
return 1;
}

// посимвольно записываем в файл
for(int i=0; i<n; i++)
{
putc(message[i], fp);
}

fclose(fp);
return 0;
}

int read(char * filename)
{
FILE * fp;
char c;
if((fp= fopen(filename, "r"))==NULL)
{
perror("Error occured while opening file");
return 1;
}
// после записи считываем посимвольно из файла
while((c=getc(fp))!= EOF)
{
printf("%c", c);
}

fclose(fp);
return 0;
}
Для записи и чтения файла определены функции write и read соответственно. В функции write пробегаемся по массиву символов и каждый из них заносим в файл, передавая символ в вызов putc().

В функции read считываем по одному символу из файла через вызов getc(). Здесь стоит обратить внимание на процесс считывания файла. Когда будет достигнут конец файла, функция getc() возвратит значение EOF, которое определено в файле stdio.h. Поэтому мы можем считывать файл, пока не получим значение EOF.

В итоге на консоль будет выведено ранее записанное сообщение, а на диске D мы сможем найти файл data.txt с этим сообщением.