Работа с бинарными файлами производится посредством посимвольного чтения-записи. Поскольку один объект char
соответствует одному байту, то фактически речь
идет о побайтовых записи/чтения.
Для записи символа в файл применяется функция putc(), которая имеет следующий прототип:
int putc(int c, FILE *stream);
В качестве параметров в функцию передаются указатель на файловый поток и символ, который надо записать. Результатом функции является записанный символ.
#include <stdio.h> int main(void) { // записываемая строка char message[] = "Hello METANIT.COM!"; // файл для записи char * filename = "data.txt"; // находим длину записываемой строки int n = sizeof(message)/sizeof(message[0]); FILE * fp= fopen(filename, "w"); if(fp) { // посимвольно записываем в файл for(int i=0; i < n; i++) { putc(message[i], fp); } fclose(fp); printf("File has been written\n"); } }
Здесь мы пробегаемся по массиву символов message и каждый из них заносим в файл data.txt (который располагается в текущей папке), передавая каждый символ в функцию
putc()
.
Для чтения одного символа применяется функция getc() (функция fgetc() аналогична). Она имеет следующий прототип:
int getc(FILE *stream);
В качестве параметра в функцию передается указатель на файловый поток, а возвращаемым значением является считанный из файла символ, точнее его числовой код.
При чтении из файла и записи в него одного символа указатель текущей позиции в потоке увеличивается, обеспечивая тем самым продвижение по файлу.
Считаем ранее записанный файл data.txt
:
#include <stdio.h> int main(void) { // символ для считывания char c; // файл для чтения char * filename = "data.txt"; FILE * fp= fopen(filename, "r"); if(fp) { // считываем посимвольно из файла while((c=getc(fp))!= EOF) { printf("%c", c); } fclose(fp); } }
Здесь считываем по одному символу из файла через вызов getc()
. Здесь стоит обратить внимание на процесс считывания файла. Когда будет достигнут конец файла, функция getc() возвратит значение EOF ("end of file" - конец файла).,
которое определено в файле stdio.h. Поэтому мы можем считывать файл, пока не получим значение EOF.
В итоге на консоль будет выведено ранее записанное сообщение.