Программирование · 5 min read · Oct 09, 2025
Изучение C/C++ шаг за шагом - Страница 12
12. Постепенное изучение CorC++ — Программирование на C - Файлы
Обработка файлов
Введение
Давайте найдем вывод следующей программы.
| |
|
Да, она принимает запись информации о студенте и отображает ее.
Вот та же программа, но с включенными операторами и несколькими изменениями.
| |
|
Вышеуказанные две программы одинаковы, но вторая программа содержит выделенное выражение ( FILE *fp = fopen(“stud.dat”, “a+”);) и несколько изменений, таких как ‘f printf’, ‘ fp’. Включены только несколько изменений. Эти изменения влияют на передачу данных с консоли на диск в файл stud.dat. Этот процесс известен как управление файлами/организация файлов.
Это самый простой способ переноса вывода с монитора в файл с использованием оператора управления файлами.
| |
|
На самом деле обработка файлов включает в себя множество операций, а также методов для реализации. Вот фактический процесс обработки файлов.
Обработка файлов
Как правило, каждая программа должна представлять полученные значения на экране (1-я программа это иллюстрирует). Но эти значения удаляются из памяти, когда программа завершается. Если мы хотим сохранить записи навсегда, сохраните их в файле. Каждый файл имеет несколько операций, вот несколько;
| |
|
| |
|
Операции с файлами
| fopen | Открывает поток filename в режиме mode & если успешно, возвращает указатель на вновь открытый поток; или Null в противном случае. |
| Синтаксис ** | FILE fopen(const char filename, const char *mode); |
| Пример | FILE fp = fopen(“stud.dat”, “r”); / Чтение из файла /
FILE fp = fopen(“emp.dat”, “w”); / Запись в файл /
FILE fp = fopen(“emp.dat”, “a+”); / Чтение и запись в файл / | | | Режим:
Строка режима, используемая в вызовах fopen, является одним из следующих значений: Режим Описание r Открыть только для чтения w Создать для записи (если файл с таким именем уже существует, он будет перезаписан). a Добавить; открыть для записи в конец файла или создать для
записи, если файл не существует. r+ Открыть существующий файл для обновления (чтение и запись) w+ Создать новый файл для обновления (чтение и запись).
Если файл с таким именем уже существует, он будет перезаписан. a+ Открыть для добавления; открыть для обновления в конце файла или
создать, если файл не существует. Чтобы указать, что данный файл открывается или создается в текстовом режиме,
добавьте “ t “ к строке ( rt, w+t,* и т.д.).
Чтобы указать двоичный режим, добавьте “ b “ к строке ( wb, a+b, и т.д.). | | fclose | Закрывает файл, на который указывает fp & возвращает 0 при успехе, EOF возвращается в случае ошибки | | Синтаксис | Int fclose(FILE *fp); | | Пример | Fclose(fp); fclose(stud); fcloseall(); | | fprintf | Отправляет форматированный вывод в поток. Использует те же спецификаторы формата, что и printf, но отправляет вывод в указанный поток. Возвращает количество байт вывода или EOF в случае ошибки. | | Синтаксис | Fprintf(fptr, “Control String”, list); | | Пример | Fprintf(fp, “%d %s %d %d %d”, sno, name, sub1, sub2, sub3);
fprintf(emp, “%d %s %d”, eno, name, sal); | | fscanf | Эта функция используется для чтения форматированных данных из указанного файла. | | Синтаксис: | Fscanf(fptr, “Control String”, list); | | Пример | Fscanf(fp, “%d %s %d %d %d”, &sno, name, &sub1, &sub2, &sub3);
fscanff(emp, “%d %s %d”, &eno, name, &sal); | | fwrite | Fwrite добавляет указанное количество одинаковых по размеру элементов данных в выходной файл. | | Синтаксис: | Size_t fwrite(const void ptr, size_t size, size_t n, FILEstream); Аргумент Что это/что делает Ptr Указатель на любой объект; данные, записанные, начинаются с ptr Size Длина каждого элемента данных N Количество элементов данных, которые будут добавлены stream Указывает выходной файл
Общее количество записанных байт составляет ( n size) | | fread | Fread извлекает указанное количество одинаковых по размеру элементов данных из входного файла. | | Синтаксис | Size_t fread(void ptr, size_t size, size_t n, FILEstream); Аргумент Что это/что делает Ptr Указатель на любой объект; данные, записанные, начинаются с ptr size Длина каждого элемента данных n Количество элементов данных, которые будут добавлены stream Указывает выходной файл
Общее количество записанных байт составляет ( n size) | | rewind | Перемещает указатель файла к началу потока | | Синтаксис | Void rewind(FILE stream);
Пример. fewind(fp);
Rewind(stream) эквивалентен fseek(stream, 0L, SEEK_SET)
за исключением того, что rewind очищает индикаторы конца файла и ошибки, в то время как fseek очищает только индикатор конца файла. После rewind следующая операция на обновленном файле может быть либо вводом, либо выводом. | | fseek | Указатель файла для потока располагается на смещении, рассчитанном от позиции, указанной whence. Смещение может быть нулевым, отрицательным или положительным. Определенные символы SEEK_CUR, SEEK_SET и SEEK_END используются в качестве спецификаторов whence для указания текущей позиции. BOF и EOF соответственно. Возвращает 0 при успехе или ненулевое значение при ошибке. | | Синтаксис | Int fssek(FILE stream, long offset, int whence); | | ftell | Возвращает текущую позицию указателя файла при успехе или отрицательное значение при ошибке. | | Синтаксис | Long ftell(FILE *stream); | | feof | Это макрос, который возвращает ненулевое значение, если конец файла был достигнут в потоке. | | Синтаксис | Int feof(FILE *stream); | | eof | Проверяет, находится ли маркер позиции в файле, заданный его дескриптором, в конце файла. Если да, возвращает 0, 1 возвращается, если маркер позиции НЕ находится в конце файла, и ошибка указывается установкой errno и возвращаемым значением -1. | | Синтаксис | Int eof(int handle); | | fgets /
fputs | Функция fgets/fputs получает/выводит строку (размером n байт) в файл, на который указывает поток, и возвращает конец файла при ошибке. | | Синтаксис | Char fgets(char s, int n, FILE *stream); | | fgetc/fputc
Синтаксис | Читает/записывает символ из потока.
Int fgetc/fputc(FILE *stream); | | fgetchar/
fputchar | Это эквивалентно вышеуказанным fgetc/fputc. |
Напишите программу для чтения данных о студенте и сохранения их в файле данных.
| | / Программа для создания файла данных о студенте /
/ 85_write.c /
#include
#include
#include
int main()
{
int sno, sub1, sub2, sub3;
char name[10],ch;
FILE *fp = fopen(“stud.dat”, “w”);
do{
clrscr();
printf(“Введите номер студента “); scanf(“%d”, &sno);
printf(“Введите имя студента “); scanf(“%s”, name);
printf(“Введите 3 оценки по предметам “);
scanf(“%d%d%d”, &sub1, &sub2, &sub3);
fprintf(fp, “%d %s %d %d %d\n”, sno, name, sub1, sub2, sub3);
printf(“\n\nХотите продолжить… (y/n)”); ch = getche();
}while(toupper(ch) != ‘N’);
fclose(fp);
return 0;
} |
Напишите программу для извлечения данных из файла данных о студенте.
| | / Программа для извлечения данных из файла данных о студенте /
/ 86_read.c /
#include
#include
int main()
{
int sno, sub1, sub2, sub3;
char name[10];
FILE *fp = fopen(“stud.dat”, “a+”);
clrscr();
printf(“Записи студентов следующие….\n”);
do{
fscanf(fp, “%d%s%d%d%d\n”, &sno, name, &sub1, &sub2, &sub3);
printf(“%5d%15s%3d%3d%3d\n”, sno, name, sub1, sub2, sub3);
}while(!feof(fp));
fclose(fp);
return 0;
} |
Get new posts in your inbox
No spam. Unsubscribe anytime.