Практическая работа №9. Работа с файлами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Практическая работа №9. Работа с файлами



работы: изучение принципов работы с файлами в С++.

 

Задачи:

1. Изучить теоретический материал

2. Написать программу согласно индивидуальному варианту задания.

3. Ответить на контрольные вопросы.

4. Оформить отчет.

 

Теоретический материал

Язык СИ "рассматривает" файл, как структуру. Все стандартные файлы (например, файл STDIO.H, содержащий информацию о вводе-выводе), содержат определение структуры файла.

Краткое наименование шаблона файла - FILE (многие системы используют директиву TYPEDEF для установления этого соответствия). Таким образом, программа, имеющая дело с файлами, должна использовать тип структуры FILE.

Открытие файла: функция fopen()

Формат: file * fopen (char * filename, char * type);

Функция использует включаемый файл stdio.h и предназначена для открытия файла, заданного именем filename, и создания потока ввода-вывода.

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

"r" - файл нужно считать;

 "w" - файл нужно записать;

 "a" - файл нужно дополнить.

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

Если использовать "w" для существующего файла, то старая версия его при этом стирается.

Попытка прочитать несуществующий файл - ошибка.

Один и тот же файл не может быть одновременно открыт на запись и на чтение. После записи файл должен быть закрыт, а потом открыт снова, уже на чтение.

Функция fopen() берет внешнее представление имени файла, а возвращает некоторое внутреннее имя; оно и используется впоследствии при чтении или записи в файл. Внутреннее имя - это указатель на файл, то есть функция возвращает указатель на file.

В случае ошибки возвращается значение null (определенное в stdio.h как 0).

Пример:

file * in;

 in = fopen ("test", "r");

Функцией возвращается, как было сказано, указатель на файл. Теперь IN является указателем на файл "TEST" С этого момента программа ссылается на файл при помощи указателя IN типа FILE, а не по имени "TEST".

Закрытие файла: функция fclose()

Формат: int fclose (file * stream);

Функция предназначена для закрытия файла. Аргументом ее является указатель на файл stream типа file, а не имя файла.

Функция возвращает 0 при успешном завершении и EOF - если обнаружена ошибка.

Например, для закрытия файла "test" нужно записать оператор:

fclose (in);

где in - указатель на файл.

Функция fclose() противоположна fopen() она разрывает связь между указателем на файл и внешним именем, которая была установлена fopen(). Теперь указатель на файл освобожден, и его можно использовать для другого файла.

Чтение символа из файла: функция getc()

Формат: int getc (file * stream);

Функция предназначена для считывания очередного символа из файла, на который ссылается указатель stream типа file.

Функция возвращает считанный символ или EOF, если обнаружена ошибка ввода-вывода или конец файла. Указатель на файл при этом устанавливается на следующий символ.

Функция используется после функции fopen(), открывающей файл, и перед fclose(), закрывающей его.

ch = getc (in);

где ch - код символа, получаемого от файла, на который указывает in типа file.

Везде, где допускаются объекты типа file, можно использовать ссылки на файлы stdin и stdout, которые в библиотеке ввода-вывода предопределены как ссылки на стандартное устройство ввода и на стандартное устройство вывода Это константы, а не переменные, им нельзя что-либо присваивать. Эти файлы открываются автоматически при старте программы и по умолчанию связываются с терминалом.

Пример:

ch = getc (stdin);

этот оператор предназначен для получения символа от стандартного ввода системы и аналогичен оператору:

сh = getchar();

Запись символа в файл: функция putc()

Формат: int putc (int ch, file * stream);

Функция предназначена для записи отдельного символа ch в файл, на который ссылается указатель stream типа file.

Функция возвращает записанный в файл символ или EOF, если обнаружен конец файла или ошибка вывода.

Например, оператор

putc (ch, in);

записывает символ ch в файл, на который ссылается указатель in типа file.

Аналогично функции getc(), можно использовать указатель на стандартный вывод stdout:

putc (ch, stdout); этот оператор эквивалентен оператору:

putchar (ch);

Функция используется после функции fopen(), открывающей файл, и перед fclose(), закрывающей его.

Каждый файл должен открываться и закрываться независимо от другого. Существует ограничение на количество файлов, которые могут быть открыты одновременно. Оно зависит от типа системы, но чаще всего находится в пределах от 10 до 20.

Пример использования функций чтения-записи файла:

# include <stdio.h>

 main() {

 file * in; // описывается указатель на файл

 int ch;

 if ((in = fopen ("test", "r"))!= null){

 // открывается файл "test" для чтения с проверкой, существует ли он

 // указатель in теперь ссылается на "test"

 while ((ch = getc (in))!= eof) // читается символ из файла

 putc (ch, stdout); // посылается на стандартный вывод

 fclose (in); // закрывается файл

 }

 else printf ("файл \ "test\ "не смог быть открыт \n");

 }

В этой программе осуществляется проверка, существует ли файл: если fopen() не способна открыть требуемый файл, она возвращает значение null (определенное в stdio.h как 0).

Форматный ввод: функция fscanf()

Формат: int fscanf(file *stream, char *format [..,argum,..]);

Функция предназначена для считывания во входной поток и преобразования данных из файла, на который ссылается указатель stream типа file.

Параметр format управляет интерпретацией полей ввода и идентичен соответствующему параметру функции scanf(). Каждый параметр argum должен быть указателем на переменную с типом, который соответствует типу, определенному в format.

В отличие от функции scanf(), первым в списке параметров функции fscanf() является указатель типа file на сам читаемый файл.

Функция используется после функции fopen(), открывающей файл, и перед fclose(), закрывающей его.

Например, файл с именем "sam" содержит следующую информацию:

 25 54.32 program

После выполнения программы:

# include <stdio.h>

 main() {

 file fi;

 int i;

 char name [50];

 float x;

 fopen ("sam", "r");

 fscanf (fi, " %d %f %s ", & i, & x, name);

 printf (" %d, %f, %s \n ", i, x, name);

 fclose (fi);

 }

переменной I будет присвоено значение 25, x - значение 54.32 и name - "program\0". Переменные i и x в функции fscanf() задаются своими адресами. name сам является указателем на начало массива.

Форматный вывод: функция fprintf()

Формат: int fprintf(file *stream, char *format[..,argum,..]);

Функция предназначена для форматного вывода в файл. Каждый аргумент из списка аргументов преобразуется и выводится согласно формату преобразования, определенному в строке format. Параметр format идентичен и имеет такое же описание, как и аналогичный параметр в функции printf(). В отличие от функции printf(), первым в списке параметров функции fprintf() является указатель типа file на сам записываемый файл.

Функция используется после функции fopen(), открывающей файл, и перед fclose(), закрывающей его.

Пример:

# include <stdio.h>

 main() {

 file * fi;

 int step;

 fi = fopen ("sam", "r"); // открывает файл "sam" для чтения

 fscanf (fi, " %d ", & step); // fi теперь указывает на файл sam

 fclose (fi);

 fi = fopen ("data", "a"); // режим дополнения

 fprintf (fi, " sam is %d \n ", step); // fi указывает на data

 fclose (fi);

 }

Чтение строки файла: функция fgets()

Формат: char * fgets (char * string, int n, file * stream);

Функция предназначена для чтения файла по строкам. Функция имеет 3 аргумента, в отличие от функции gets(), имеющей один аргумент.

Первый аргумент является указателем на местоположение считываемой строки. Вводимая информация располагается в символьный массив string.

Второй аргумент содержит предельную длину считываемой строки. Функция прекращает работу после считывания символа новой строки '\n' или после считывания символов общим числом n-1 (в зависимости от того, что произойдет раньше). В любом случае нулевой символ '\0' добавляется в самый конец строки.

Третий аргумент указывает на файл, который будет читаться.

Функция fgets() возвращает значение null, если встречает символ eof (конец файла).

 Разница между gets() и fgets() заключается в том, что gets() заменяет символ новой строки '\n' на '\0', в то время, как fgets() сохраняет символ новой строки.

Пример:

# include <stdio.h>

 # define maxlin 80

 main() { // считывает файл строка за строкой

 file * f1;

 char * string [maxlin];

 f1 = fopen ("story", "r"); // открывает файл story для чтения

 while (fgets (string, maxlin, f1)!= null)

 puts (string);

 fclose (f1);

 }

Запись строки в файл: функция fputs()

Формат: int fputs (char * string, file * stream);

Функция предназначена для копирования строки string в файл, предварительно открытый при помощи функции fopen(), на который ссылается указатель stream типа file. Нулевой символ '\0', завершающий строку, не копируется.

Функция fputs() возвращает последний записанный символ. Если строка string пустая, то возвращается 0, и eof - в случае ошибки.

В отличие от функции puts(), функция fputs() не добавляет символ новой строки '\n' в ее вывод.

Пример:

file * ptr;

 fputs ("wonderful day", ptr);

этот оператор передает строку "wonderful day" в файл, на который ссылается указатель ptr типа file. Конечно, файл сначала должен быть открыт с помощью функции fopen().

Функция произвольного доступа fseek()

Формат: int fseek (file *stream, long offset, int fromwhere);

Функция предназначена для перемещения указателя файла, открытого функцией fopen(), в новую позицию, задаваемую смещением offset (в байтах), от позиции, задаваемой параметром fromwhere. Следующая операция ввода-вывода для файла выполняется с этой новой позиции.

Первым аргументом функции является указателем типа file на файл, в котором ведется поиск.

Второй аргумент offset, сообщающий как далеко следует продвинуться от начальной точки, должен иметь значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад).

Третий аргумент является кодом, определяющим начальную точку, и может принимать одно из следующих значений:Код   Положение в файле

0     начало файла

1     текущая позиция

2     конец файла

 

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

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

Для таких устройств, как терминал и принтер, функция fseek() возвращает неопределенное значение.

 

Пример:

# include <stdio.h>

 main() {

 file * stream;

 int result;

 long map = 0l;

 stream = fopen ("data", "r");

 // установка указателя на начало файла

 result = fseek (stream, map, 0);

 printf ("result = %d\n", result);

 // result = 0, если указатель успешно перемещен

 putchar (getc (stream)); // вывод указанного символа

 fseek (stream, _ (map + 3), 2);

 // перемещение указателя от конца файла

 putchar (getc (stream);

 fclose (stream);

 }

 

Стирание файла: функция delete()

Формат: int delete (char * filename);

Функция стирает файл, имя которого указано в строке filename.

Функция возвращает 1 при успешном завершении и 0 при ошибке.

Выход: функция exit()

Формат: exit (int status);

Функция завершает вызванный процесс. Она часто используется для прекращения работы программы при появлении ошибки. Если к exit() обратились из функции, вызванной головной программой main(), то прекращает работу вся программа, а не только эта функция.

Функция exit() закрывает любые файлы, открытые функцией fopen(). Это делает выход из программы более корректным.

Если функция используется с аргументом, то им является номер кода ошибки. Обычно значение 0 используется для указания нормального окончания, ненулевое значение указывает на некоторую ошибку.

Функция не возвращает значения.

Индивидуальные варианты заданий

Часть

3. Выполнить задания лабораторной работы №4 (Работа со строками) в соответствии со своим вариантом, организовав чтение входной текстовой информации из файла.

 

 

 

#include "stdafx.h"

#include <iostream>

#include <stdio.h>

 

using namespace std;

#define _CRT_SECURE_NO_WARNINGS

 

int _tmain(int argc, _TCHAR* argv[])

{

 

 

  const int max = 100;

  char str[max];

 

  FILE *in; // описывается указатель на файл

  int ch;

      

  fopen_s(&in,"text.txt", "r");

      

  cout << "Stroka iz faila" << endl;

  if (in!= NULL)

  {

        fgets(str, max, in);

  }

      

  cout << str << endl;

  int n = strlen(str);

  int i = 0;

  char w[max];

  int l = 0;

  int j = 0;

  int x = 0;

  for (int h = 0; h < max; h++)

  {

        w[h] = '\0';

  }

  while (i < n)

  {

        if (str[i]!= ' ')

        {

               w[j] = str[i];

               j++;

        }

        else

        {

               l = strlen(w);

               if (l <= 4) x++;

               j = 0;

               for (int h = 0; h < max; h++)

               {

                      w[h] = '\0';

               }

 

        }

        i++;

 

 

  }

  cout << "Kolichestvo slov ne bolee 4 bukv - " << x;

  cin >> str;

 

  return 0;

}

 

2 часть (общая для всех вариантов)

1. Напишите программу, которая создает файл numbers.txt и записывает в него 5 введенных пользователем целых чисел.

2. Напишите программу, которая вычисляет среднее арифметическое чисел, находящихся в файле numbers.txt из предыдущего задания.

3. Напишите программу, которая позволяет просматривать текстовые файлы (выводит на экран содержимое файла), например, файлы исходных программ C++. Имя просматриваемого файла должно передаваться программе в качестве параметра, в командной строке во время ее запуска.

 

Контрольные вопросы

1. Как открывать и закрывать текстовые файлы?

2. Что такое тип file?

3. Как осуществляется чтение из файла и запись в него?

4. Как получить строку из файла?

5. Как записать строку в файл?

 

Содержание отчета

1. Титульный лист

2. Цели, задачи работы

3. Индивидуальное задание

4. Блок-схема алгоритма (для каждой задачи)

5. Листинг программы(для каждой задачи)

6. Результат выполнения программы – скриншот (для каждой задачи)

7. Ответы на контрольные вопросы

 



Поделиться:


Последнее изменение этой страницы: 2021-04-20; просмотров: 123; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.21.5 (0.125 с.)