Перейти к содержимому

Как работать с файлами в си

  • автор:

Как работать с файлами в си

Язык 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 — Работа с файлами через язык Си

За счёт языка Си вы можете с легкостью манипулировать файлами и помещать в них различную информацию и позже считывать её. За урок мы научимся работать с файлами через язык Си.

Видеоурок

Многие языки программирования предоставляют классы для работы с файлами и директориями проекта. Язык Си обладает множеством возможностей для записи и чтения данных из файлов.

Работа с файлами

При работе с файлами всегда необходимо помнить две вещи:

  1. Перед началом работы с файлом его необходимо открыть;
  2. После завершения работы с файлом его необходимо закрыть.

Если файл не открыт или же неверно открыт, то вы не можете полноценно работать с его содержимым.

С закрытием все проще, но и коварнее. Если вы не закроете файл, то программа будет работать верно, тем не менее, чем больше будет открытых файлов, тем больше программа будет перегружена и в какой-то момент она просто зависнет или выключиться.

Запись данных в файл

При записи данных в файл его изначально необходимо открыть. Для этого в языке Си используется функция 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 – в противном случае.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *