Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ЭУМКД КИТ-ч1-Бутов.docx
Скачиваний:
9
Добавлен:
05.05.2019
Размер:
262.85 Кб
Скачать

Тема 11. Файлы

Для работы с файлом нужно сначала объявить указатель файла, который будет в дальнейшем использоваться для непосредственной работы с файлом:

FILE *fp;

где FILE - имя типа по аналогии с char, int, float, double; fp - переменная-указатель на файл.

Далее нужно открыть файл, т.е. связать указатель файла с конкретным файлом, который или уже существует или будет создаваться. Для этого используется функция fopen(<имя файла>, <режим>), например:

fp = fopen("myFile1", "w");

Здесь "myFile1" - имя файла, "w" - режим использования файла. Возможны следующие режимы:

"r" - чтение существующего файла;

"w" - запись в файл (если он существует, то его содержимое уничтожается; если файл

отсутствует, то он будет создан;

"a" - добавление в конец файла (если файл отсутствует, то он будет создан).

Чтобы выполнялись и чтение и запись нужно в стринг режима добавить знак "+". Для бинарных (двоичных) файлов в стринг режима нужно добавить букву "b", а для текстовых файлов - букву "t" (последнее подразумевается по умолчанию).

Теперь можно работать с файлом с помощью библиотечных функций fscanf и fprintf. Эти функции аналогичны функциям scanf и printf и отличаются тем, что ввод/вывод данных, связанный с консолью, теперь перенаправляется в файл, для чего в эти функции добавлен еще один аргумент - указатель файла.

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

Пример 1. Запишем в файл myFile1 данные, а затем выполним чтение этих данных из файла:

int n1 = 123, n2 = 6789, n3, n4;

char m1[] = "Character_data", m2[50];

fprintf(fp, "%d %d %s", n1, n2, m1); //запись данных в файл из n1, n2 и массива m1

fclose(fp); //закрытие файла

fp = fopen("myFile1", "r"); //открытие файла на чтение

fscanf(fp, "%d%d%s", &n3, &n4, m2); //чтение данных из файла в n3, n4 и массив m2

fclose(fp); //закрытие файла

puts("------ Numbers and string: ------");

printf("%d %d %s", n3, n4, m2); //вывод данных на экран из n3, n4 и массива m2

puts(""); //переход к новой строке

Все то же самое можно выполнить, открывая файл один раз и используя функцию rewind для перемещения указателя файла к началу файла:

fp = fopen("myFile1", "w+"); //открытие файла на запись и чтение

fprintf(fp, "%d %d %s", n1, n2, m1); //запись данных в файл

rewind(fp); //переход к началу файла

fscanf(fp, "%d%d%s", &n3, &n4, m2); //чтение данных из файла

fclose(fp); //закрытие файла

printf("%d %d %s\n", n3, n4, m2); //вывод данных на экран

Пример 2. Запишем в файл, а затем прочитаем из него структуру данных:

struct student {

char familia[50];

int N_zachetki, god_rogdenia;

} stu = {"Ivanov_Ivan_Ivanovich", 572203, 1987};

fp = fopen("myFile2", "w+"); //открытие файла на запись и чтение

fprintf(fp, "%s %d %d", stu.familia, stu.N_zachetki, stu.god_rogdenia); //запись данных

//в файл

rewind(fp); //переход к началу файла

fscanf(fp, "%s%d%d", m2, &n3, &n4); //чтение данных из файла

fclose(fp); //закрытие файла

puts("------ Struktura: ---------------");

printf("%s %d %d\n", m2, n3, n4); //вывод данных на экран

Пример 3. Запишем в файл и прочитаем из него массив данных:

int mas1[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

int mas2[10];

fp = fopen("myFile3", "w+"); //открытие файла на запись и чтение

for (int i=0; i<10; ++i)

fprintf(fp, "%d ", mas1[i]);

rewind(fp); //переход к началу файла

for (i=0; i<10; ++i)

fscanf(fp, "%d", &mas2[i]);

fclose(fp);

puts("------ Massiv: ------------------");

for (i=0; i<10; ++i)

printf("%d ", mas2[i]);

Замечание 1. Если при чтении достигнут конец файла, то следующая функция чтения fscanf возвращает константу EOF (End Of File). Поэтому, если неизвестно, сколько данных содержится в файле, то можно организовать чтение в цикле и выйти из него по условию, например, так:

while (1)

{

. . .

if (fscanf(fp, "%d ", &n) == EOF)

break; //выход из цикла

. . .

}

Замечание 2. Для работы с символьной информацией можно также использовать функции fgets и fputs, которые похожи на функции gets и puts, но отличаются тем, что в них добавлен еще один аргумент - указатель файла, а в функцию fgets - еще и агрумент, задающий число считываемых символов (может быть считано меньше символов, если встретится символ перевода строки или символ конца файла).

Рассмотренный выше пример с двумя числами n1 и n2 и стрингом m1 можно записать с использованием функций fgets и fputs следующим образом:

fp = fopen("myFile4", "w+"); //открытие файла на запись и чтение

fprintf(fp, "%d %d ", n1, n2); //запись чисел n1 и n2 в файл

fputs(m1, fp); //запись стринга m1 в файл

rewind(fp); //переход к началу файла

fscanf(fp, "%d%d ", &n3, &n4); //чтение чисел из файла в n3 и n4

fgets(m2, 15, fp); //чтение стринга из файла в m2

fclose(fp); //закрытие файла

puts("------ Numbers and string: ------");

printf("%d %d %s\n", n3, n4, m2); //вывод данных на экран

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]