Warning: session_start(): open(C:\Windows\temp\sess_adjc40cstoe8vidujatnhsmgf0, O_RDWR) failed: No space left on device (28) in C:\www\lemma4.1php\login.php on line 15 Warning: session_commit(): open(C:\Windows\temp\sess_adjc40cstoe8vidujatnhsmgf0, O_RDWR) failed: No space left on device (28) in C:\www\lemma4.1php\login.php on line 36 Warning: session_commit(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (C:\Windows\temp) in C:\www\lemma4.1php\login.php on line 36 Основы языка Си


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


  • fgetc() / fputc() - ввод-вывод одного символа;


Бинарный обмен с файлами


int getc(FILE *stream);

int putc(int c, FILE *stream);

Обращение к ним имеет следующий формат:


c=getc(fp);

putc(c, fp);


где fp - указатель на поток, c - переменная типа int для приема очередного символа из файла или для записи ее значения в файл.




Для работы с текстовыми файлами удобно использовать следующие функции:



Функция fputs() записывает строку s в файл, на который указывает stream и возвращает целое неотрицательное число. При ошибке функция возвращает EOF. Символ ‘\0’ в файл не переносится, и символ ‘\n’ не записывается в конце строки вместо ‘\0’.


Функция fgets() читает из определенного указателем stream файла не более n-1 символов и записывает их в строку s. Функция прекращает работу, как только прочтет n-1 символов или встретит символ перехода на новую строку ‘\n’, который переносится в строку s. Дополнительно в s записывается символ‘\0’.




Функции форматированного обмена с файлами имеют следующие прототипы:


int fprintf(указатель_на_поток, форматная_строка, список_переменных);

int fscanf(указатель_на_поток, форматная_строка, список_адресов_переменных);


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


Блочный (буферизованный) ввод-вывод



fread(void *buffer, int k, int n, FILE *stream);

fwrite(void *buffer, int k, int n, FILE * stream);



Здесь buffer – указатель на область памяти, из которой будут читаться данные или в которую они будут записываться. k – это размер блока обмениваемых данных, n – количество таких блоков, stream – указатель на поток, с которым производится обмен.


Позиционирование в потоке


Рассмотренные в предыдущих разделах средсва для работы с файлами позволяют записывать данные в файл и читать из него только последовательно. При этом работа с файлом осуществляется в текущей позиции в потоке. В зависимости от режима открытия файла текущая позиция устанавливается на начало (“r”,“w”) или конец (“a”) файла. При выполнении каждой операции указатель на текущую позицию автоматически устанавливается в новое положение в зависимости от числа обработанных байтов.


Функция fseek() позволяет перемещать указатель текущей позиции на нужный байт. Это дает возможность работать с файлом на диске как с обычным массивом, осуществляя доступ к содержимому файла в произвольном порядке. Эта функция имеет следующий прототип:


int fseek(указатель_на_поток, смещение, начало_отсчета);


Смещение задается переменной или выражение типа long и может быть отрицательным, т.е. переещение по файло может идти как в прямом, так и в обратном направлениях.


Начало_отсчета задается одной изпредопределенных констант:


  • SEEK_SET (0 – начало файла);
  • SEEK_CUR (1 = текущая позиция);
  • SEEK_END (2 – конец файла);


Функция возвращает 0, если перемещение выполнено успешно, в противном случае возвращается ненулевое значение.