Как работать с файлами в си
Язык C позволяет осуществлять различные операции с файлами. В большинстве случаев эти операции не связаны с какими-либо сложностями.
Открытие файлов
FILE *fp;
fp = fopen(filename, mode);
Параметр filename позволяет передать имя файла (при отсутствии имени файла функция вернет NULL). Параметр mode позволяет указать режим открытия файла. Существуют следующие режимы открытия файлов:
- r — открытие файла для чтения с позиционированием указателя в начале файла.
- r+ — открытие файла для чтения и записи с позиционированием указателя в начале файла.
- w — удаление содержимого существующего файла или создание нового файла для последующей записи с позиционированием указателя в начале файла.
- w+ — удаление содержимого существующего файла или создание нового файла для последующего чтения и записи с позиционированием указателя в начале файла.
- a — создание или открытие существующего файла для дополнения с позиционированием указателя в конце файла.
- a+ — создание или открытие существующего файла для чтения и дополнения с позиционированием указателя в начале файла для чтения и в конце файла для дополнения.
Закрытие файлов
Закрытие файла должно осуществляться сразу же после окончания работы с ним для предотвращения потери данных. Следует убедиться в том, что содержимое файла не модифицируется после его закрытия.
Чтение данных из файлов
Для чтения данных из файла следует создать буфер (или буферы), в который будут помещаться прочитанные данные, целочисленную переменную, в которой будет сохраняться возвращаемое функцией количество прочитанных байтов и воспользоваться функцией fread().
size_t bytesread;
char buffer[100];
bytesread = fread(buffer, sizeof(buffer), 1, fp);
В качестве первого параметра используется указатель на буфер, в качестве второго — размер этого буфера, в качестве третьего — количество буферов для чтения, а в качестве четвертого — открытый файл. При достижении конца файла функция будет возвращать, как и в случае ошибки, нулевое значение, поэтому успешное достижение конца файла может быть установлено с помощью feof(), а возникновение ошибки — с помощью функции ferror().
Для чтения строк из текстового файла может использоваться функция fgets(). При работе с ней также следует использовать буфер для сохранения прочитанной строки.
char buffer[100];
fgets(buffer, sizeof(buffer), fp);
В качестве первого параметра используется указатель на буфер, в качестве второго — размер этого буфера, в качестве третьего — открытый файл. Функция возвращает NULL в случае ошибки или достижения конца файла.
Запись данных в файлы
Для записи данных в файл следует подготовить буфер (или буферы) с данными для записи, целочисленную переменную, в которой будет сохраняться возвращаемое функцией количество записанных байтов и воспользоваться функцией fwrite().
size_t byteswritten;
char buffer[100];
byteswritten = fread(buffer, sizeof(buffer), 1, fp);
В качестве первого параметра используется указатель на буфер, в качестве второго — размер этого буфера, в качестве третьего — количество буферов для записи, а в качестве четвертого — открытый файл. При возникновении ошибки функция будет возвращать нулевое значение.
Для записи строк в текстовый файл может использоваться функция fputs(). При работе с ней также следует подготовить буфер со строкой для записи.
char buffer[100];
fputs(buffer, sizeof(buffer), fp);
Функция возвращает количество записанных байтов или символ EOF в случае возникновения ошибки.
Переименование файлов
Файлы могут свободно переименовываться. Для этого достаточно задать текущее и новое имена интересующего файла. Функция rename() возвращает нулевое значение при удачном переименовании файла.
res = rename(old, new);
С помощью первого параметра передается текущее имя файла, с помощью второго — его новое имя.
Удаление файлов
Файлы также могут удаляться. Для этого достаточно задать текущее имя интересующего файла. Функция remove() возвращает нулевое значение при удачном удалении файла.
С помощью единственного параметра передается имя существующего файла.
Права доступа
Каждый файл имеет права доступа, которые могут изменяться его владельцем при необходимости. В некоторых случаях файл может создаваться с правами только для чтения, что позволит предотвратить его изменение или с правами для исполнения, что позволит исполнять его как программу.
Функция chmod() позволяет устанавливать права доступа к файлу.
Параметр filename позволяет передать имя файла, права доступа к которому необходимо изменить. Параметр mode позволяет указать права доступа к файлу в восьмеричном формате.
Пример
Данная простая программа построчно читает содержимое файла из виртуальной файловой файловой системы /proc и выводит информацию об установленном в компьютере центральном процессоре.
#9 — Работа с файлами через язык Си
За счёт языка Си вы можете с легкостью манипулировать файлами и помещать в них различную информацию и позже считывать её. За урок мы научимся работать с файлами через язык Си.
Видеоурок
Многие языки программирования предоставляют классы для работы с файлами и директориями проекта. Язык Си обладает множеством возможностей для записи и чтения данных из файлов.
Работа с файлами
При работе с файлами всегда необходимо помнить две вещи:
- Перед началом работы с файлом его необходимо открыть;
- После завершения работы с файлом его необходимо закрыть.
Если файл не открыт или же неверно открыт, то вы не можете полноценно работать с его содержимым.
С закрытием все проще, но и коварнее. Если вы не закроете файл, то программа будет работать верно, тем не менее, чем больше будет открытых файлов, тем больше программа будет перегружена и в какой-то момент она просто зависнет или выключиться.
Запись данных в файл
При записи данных в файл его изначально необходимо открыть. Для этого в языке Си используется функция fopen :
// Создание/открытие файла "examples.txt" // Можно было использовать метод fopen FILE *file = fopen("examples.txt", "w"); // Помещение данных fprintf(file, "Hello George"); // Закрываем файл fclose(file);
Таким образом мы можем открыть файл и поместить в него любую информацию.
Режим необходимо прописывать в качестве второго параметра при открытии файла:
Чтение данных из файла
Для чтения данных файл необходимо также изначально открыть и в конце закрыть. Чтобы прочесть содержимое файла используется функция fgets :
FILE *file = fopen("test.txt", "r"); fgets(line, 255, file); printf("%s", line); fclose(file);
Программа обучения
Также хотим отметить, что если вас интересует более углубленное изучение языка и его фреймворков, то предлагаем вашему внимаю наш полный курс по изучению C++ . За курс вы изучите язык C++, научитесь работать с библиотекой STL, базами данных, многопоточностью и научитесь строить приложения при помощи WinForms и QT.
Весь код будет доступен после подписки на проект!
Работа с файлами в си ввод и вывод в файл в си
В этой статье мы узнаем, как считывать данные из файлов и записывать информацию в файлы в программах си. Файлы в си используются для того, чтобы сохранять результат работы программы си и использовать его при новом запуске программы . Например можно сохранять результаты вычислений , статистику игр.
Чтобы работать с файлами в си необходимо подключить библиотеку stdio.h
#include
Чтобы работать с файлом в си необходимо задать указатель на файл по образцу
FILE *имя указателя на файл;
Например
FILE *fin;
Задает указатель fin на файл
Дальше необходимо открыть файл и привязать его к файловому указателю. Для открытия файла в си на чтение используется команда
Имя указателя на файл= fopen(«путь к файлу», «r»);
Например следующая команда
fin = fopen(«C:\\Users\\user\\Desktop\\data.txt», «r»);
откроет файл data.txt, находящийся на рабочем столе по пути C:UsersuserDesktop Чтобы узнать путь к файлу можно выбрать файл мышью нажать на правую кнопку мыши и выбрать свойства файла. В разделе Расположение будет указан путь к файлу. Обратите внимание , что в си путь указывается с помощью двух слешей.
После работы с файлом в си , необходимо его закрыть с помощью команды
fclose(имя указателя на файл)
Считывание информации из текстового файла в Си
Чтобы можно было считывать русские символы из файла, необходимо настроить работу с Кириллицей с помощью команды
setlocale(LC_ALL, «Russian»);
При этом необходимо в начале программы подключить #include
Оператор fscanf()
Для считывания слова из файла в си используется команда fscanf(). Эта команда аналогична команде ввода информации с клавиватуры в си scanf() только первый параметр это указатель на файл
fscanf(указатель на файл,»%формат ввода данных1% форматввода данных2…»,&перменная1,&переменная2…);
Например команда
fscanf(fin,»%d%d%d»,&a,&b,&c);
считает из файла, который привязан к указателю на файл fin строку из трех целочисленных переменных
Разберем пример программы, которая считывает из текстового файла data.txt в которые записаны три столбца цифр информацию и записывает ее в массивы. Для каждого столбца информации свой массив. Подробно о работе с массивами в Си.
#include
#include
main()
< int a[10];
int b[10];
int c[10];
int i;
// определяем указатель на файл
FILE *fin;
// открываем файл на чтение
fin = fopen(«C:\\Users\\user\\Desktop\\data.txt», «r»);
// построчное считывание из файла
for (i=0;i <3;i++)
// считывание строки из трех значений файла и запись в массивы
fscanf(fin,»%d%d%d»,&a[i],&b[i],&c[i]);
>
// вывод массивов на экран
for (i=0;i <3;i++)
printf(«%d %d %d\n»,a[i],b[i],c[i]);
>
getch();
// закрытие файла
fclose(fin);
>
Построковое считывание информации из файла в СИ.Функция fgets ( )
Оператор fscanf() считывает из файла слово , т.е. до первого встречного пробела.
Чтобы считать из файла всю строку из файла в Си используется конструкция
if ( NULL != fgets (строковая переменная, длина строки, указатель на файл ) )
действия при считывании строки
>
Например программа на Си которая считывает две строки из файла и выводит их на экран
#include
#include
#include
main()
// задаем строковые перменные
char st1[100];
char st2[100];
//определяем указатель на файл
FILE *fin;
// настриваем работу с Кириллицей
setlocale(LC_ALL, «Russian»);
// открываем файл на чтение
fin = fopen(«C:\\data.txt», «r»);
// считываем первую строку из файла
if ( NULL != fgets ( st1, 100, fin ) )
// выводим строку на экран
printf(«%s «,st1);>
// считываем вторую строку из файла
if ( NULL != fgets ( st2, 100, fin ) )
// выводим строку на экран
printf(«%s\n»,st2);>
// закрываем файл на чтение
fclose(fin);
>
Запись информации в текстовый файл в Си
Для записи данных в файл в Си, необходимо открыть файл в режиме записи
Имя указателя на файл= fopen(«путь к файлу», «w»);
Для записи в строку текстового файла используется команда fprnitf(), которая аналогична команде printf() вывод на экран в си только первый параметр это указатель на файл
fprintf (имя указателя на файл,”%формат ввода”, переменные);
Например запись в файл out.txt значение переменной а
a=10;
fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
fprintf (fout,”%d”, a);
Пример программы на си которая запрашивает два числа и записывает в файл out.txt оба эти числа и их сумму
main()
< int a;
int b;
int c;
FILE *fout;
fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
printf («введите первое число \n»);
scanf(«%d», &a);
printf («введите второе число \n»);
scanf(«%d», &b);
c=a+b;
fprintf(fout,»%d %d %d»,a,b,c);
getch();
fclose(fout);
>
Вернуться к содержанию
Перейти к уроку Ошибки в программах на си
Работа с файлами в СИ
Файл – это именованная область данных на каком-либо носителе информации. Типы файлов (относительно языка «СИ»):
текстовые;
бинарные.
Основные операции производимые над файлами:
Открытие файлов.
Чтение и запись данных.
Закрытие файлов.
Дополнительные операции:
Навигация по файлу.
Обработка ошибок работы с файлами.
Удаление и переименование файлов.
Описание переменной
Библиотека stdio.h
FILE *имя = NULL;
Открытие файла
FILE *fopen(const char *filename, const char *mode);
filename – название файла.
mode – режим открытия.
Функция возвращает указатель на файл, если тот был успешно открыт. В противном случае – NULL. Только имя, если файл находится в текущем каталоге. Иначе необходимо указать абсолютный или относительный путь к файлу.
Примеры:
«data.txt”
«..\\files\\data.txt»
«d:\\temp\\data.txt»
Режимы открытия файлов с СИ
| r | только чтение |
| w | Только запись. Если файл существовал, то он переписывается. |
| a | Добавление: открытие файла для записи в конец, или создание файла. |
| r+ | Открывает файл для обновления (чтение и запись). |
| w+ | Открывает файл для обновления (чтение и запись), переписывая файл, если он существует. |
| a+ | Открывает файл для записи в конец файла или для чтения. |
Перенаправление потоков
FILE * freopen(const char *filename, const char *mode, FILE *stream);
Функция возвращает:
Указатель на файл – все нормально,
NULL – ошибка переопределения.
Закрытие файла
int fclose(FILE *stream);
stream — указатель на открытый файл.
Функция возвращает:
0 – файл успешно закрыт.
1 – произошла ошибка закрытия файла.
Проверка на достижение конца файла
int feof(FILE *stream);
stream — указатель на открытый файл.
Функция возвращает:
0 – если конец файла еще не достигнут.
!0 – достигнут конец файла.
Открытие текстовых файлов
Во втором параметре дополнительно указывается символ t (необязательно):
rt, wt, at, rt+, wt+, at+
Чтение из текстового файла
Форматированное чтение
int fscanf(FILE *stream, const char * format, [arg] . );
Функция возвращает:
buffer – все нормально,
NULL – ошибка или достигнут конец файла.
Чтение строки
char * fgets(char * buffer, int maxlen, FILE *stream);
Функция возвращает:
buffer – все нормально,
NULL – ошибка или достигнут конец файла.
Чтение символа
int fgetc(FILE *stream);
Функция возвращает:
код символа – если все нормально,
EOF – если ошибка или достигнут конец файла.
Помещение символа обратно в поток
int ungetc(int c, FILE *stream);
Функция возвращает:
код символа – если все успешно,
EOF – произошла ошибка.
Запись в текстовый файл в СИ
Форматированный вывод
int fprintf(FILE *stream, const char *format, [arg] . );
Функция возвращает:
число записанных символов – если все нормально,
отрицательное значение – если ошибка.
Запись строки
int fputs(const char *string, FILE *stream);
Функция возвращает:
число записанных символов – все нормально,
EOF – произошла ошибка.
Запись символа
int fputc(int c, FILE *stream);
Функция возвращает:
код записанного символа – все нормально,
EOF – произошла ошибка.
Открытие бинарных файлов
Во втором параметре дополнительно указывается символ b (обязательно):rb, wb, ab, rb+, wb+, ab+
Чтение из бинарных файлов
size_t fread(void *buffer, size_t size, size_t num,FILE *stream);
Функция возвращает количество прочитанных блоков. Если оно меньше num, то произошла ошибка или достигнут
конец файла.
Запись в бинарный файл
size_t fwrite(const void *buffer, size_t size, size_t num, FILE *stream);
Функция возвращает количество записанных блоков. Если оно меньше num, то произошла ошибка.
Навигация по файлу
Чтение текущего смещения в файле:
long int ftell(FILE *stream);
Изменение текущего смещения в файле:
int fseek(FILE *stream, long int offset, int origin);
SEEK_SET (0) – от начала файла.
SEEK_CUR (1) – от текущей позиции.
SEEK_END (2) – от конца файла.
Функция возвращает:
0 – все нормально,
!0 – произошла ошибка.
Перемещение к началу файла:
void rewind(FILE *stream);
Чтение текущей позиции в файле:
int fgetpos(FILE *stream, fpos_t *pos);
Установка текущей позиции в файле:
int fsetpos(FILE *stream, const fpos_t *pos);
Функции возвращают:
0 – все успешно,
!0 – произошла ошибка.
Структура fpos_t:
typedef struct fpos_t long off;
mbstate_t wstate;
> fpos_t;
Получение признака ошибки:
int ferror(FILE *stream);
Функция возвращает ненулевое значение, если возникла ошибка.
Функция сброса ошибки:
void clearerr(FILE *stream);
Функция вывода сообщения об ошибке:
void perror(const char *string);
Буферизация
Функция очистки буфера:
int fflush(FILE *stream);
Функция возвращает:
0 – все нормально.
EOF – произошла ошибка.
Функция управления буфером:
void setbuf(FILE *stream, char * buffer);
Создает буфер размером BUFSIZ. Используется до ввода или вывода в поток.
Временные файлы
Функция создания временного файла:
FILE * tmpfile(void);
Создает временный файл в режиме wb+. После закрытия файла, последний автоматически удаляется.
Функция генерации имени временного файла:
char * tmpnam(char *buffer);
Удаление и переименование
Функция удаления файла:
int remove(const char *filename);
Функция переименования файла:
int rename(const char *fname, const char *nname);
Функции возвращают:
0 – в случае успеха,
!0 – в противном случае.