ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 26.05.2023

Просмотров: 274

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

if (ferror(fp)) { команды обработки ошибок ввода/вывода }

Как только произойдет ошибка, выполнится эта функция, и начнут работать команды обработки ошибок.

  1. Функция exit()

Вид функции: exit(int status);

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

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

Стандартный ввод/вывод

файл операционный система ввод

Когда происходит открытие программы вместе с этим открываются сразу три различных файла:

  • файл стандартного ввода.

Указатель для него называется stdin;

  • файл стандартного вывода.

Указатель для него называется stdout;

  • файл стандартного вывода ошибок.

Указатель для него называется stderr.

Во время работы с файлами можно использовать их для направления данных в стандартные потоки ввода/вывода(клавиатура/экран). Например, чтобы ввести строку с клавиатуры, можно применить функцию fgets() в виде: fgets(s, maxline, stdin); а для вывода строки на экран — функцию fputs()в виде: fputs(s, stdout); Из перечисленного выше списка функций используемых при операциях ввода/вывода, ясно, что существуют функции getc(fp), putc(c,fp), которые соответственно вводят один символ из файла с указателем fp и пишут один символ в файл с указателем fp. Если вместо указателя fp, который имеет тип FILE, в эти функции поместить указатели стандартного потока, то они станут соответственно вводить один символ с клавиатуры и выводить его на экран.

В языке С можно переключить обычный ввод на ввод из файла: если некоторая программа с именем p1.exe использует функцию getchar(), то используя командную строку:

p1.exe < anyFILE1[19]

получим ввод не с клавиатуры, а из файла anyFILE1. Командную строку в С можно использовать с помощью системной функции system() в виде:

system("P1.EXE < ANYFILE1");

причем символы должны быть в верхнем регистре, т.к. выполняется команда DOS. Точно так же, как и для ввода, можно перенаправить стандартный вывод в файл. Если имеем программу p2.exe, которая использует стандартный вывод, то с помощью выполнения командной строки:


p2.exe > anyFILE2[20]

получим вывод в файл anyFILE2.

Рассмотрим основные функции стандартного ввода/вывода языка C.

  1. Функция getchar()

Формат функции: getchar();

Функция вводит с клавиатуры один символ и возвращает его. Обращаться к этой функции можно так:

char c; // или int c;

c = getchar();

  1. Функция putchar()

Формат функции: putchar(c);

Выводит значение переменной с (один символ) на стандартное выводное устройство.

  1. Функция printf()

Формат функции: printf(Control, arg1, arg2, ... , argn);

Это функция форматного вывода. Она выводит на экран содержимое arg1, arg2, ... , argn и возвращает количество выводимых байт. Control – управляющая символьная строка, в которой находятся форматы вывода на экран для соответствующих аргументов arg1, arg2, ... , argn, т. е. первый формат – для вывода arg1, второй — для arg2 и т. д. Все символы, находящиеся между форматами, выводятся один к одному, т. е. не форматируются. Это дает возможность вывода дополнительного текста для улучшения читаемости результата вывода. Форматы вывода задаются так: любой формат начинается с символа '%' и заканчивается одним из символов форматирования перечисленных ниже:

        • d – аргумент преобразуется к десятичному виду (с учетом знака);
        • x – аргумент преобразуется в беззнаковую шестнадцатеричную форму;
      • U – аргумент преобразуется в десятичную форму без знака;
        • с – аргумент рассматривается как отдельный символ;
        • s – аргумент рассматривается как строка символов; символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности;
        • е – аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в экспонентном виде;
        • f – аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму;
        • n – указатель на целое со знаком;
        • p – входной аргумент выводится как указатель.

Между границами формата вывода (от знака % до символа-спецификатора типа выводимого аргумента) находятся:

[флажки][ширина][.точность][F|N|h|l|L]

  1. Функция scanf()

Формат функции: scanf(Control, arg1, arg2, ... , argn);

[21]Это функция форматного ввода с клавиатуры. Она осуществляет ввод символов с клавиатуры и преобразует их в соответствии с установленным форматом для каждого значения, указанном в управляющей (форматной) символьной строке Control, а результаты форматирования записываются в аргументы arg1, arg2, ..., argn. Назначение строки Control тот же, что и в функции printf(). Так как arg1, arg2, ..., argn – это выходные параметры функции, то при обращении к функции они должны задаваться своими адресами: поскольку имя массива — это указатель на его первый элемент, а аргументы, которые не являются указателями, задаются как &arg.[22] Форматная строка Control – является символьной строкой, которая содержит три типа объектов: незначащие символы, значащие символы и спецификации формата. [23]Незначащие символы – это пробел, знак табуляции (\t), символ перехода на новую строку (\n). Когда функция натыкается на незначащий символ в строке формата, она считывает его, но не сохраняет все незначащие символы которые следуют за ним до того, пока не встретится первый значащий символ. Значащие символы – это все символы кода ASCII, кроме символа '%'. Если функция встречает в форматной строке значащий символ, она его считывает, но не сохраняет. Спецификация формата функции имеет вид:


%[*][ширина][F/N] [h/l] символ_формата

  1. Функция sprintf()

Формат функции такой: sprintf(string, Control, arg1, arg2, ... , argn);

Эта функция аналогична printf(), за исключением того, что результат своей работы она выводит не на стандартное устройство вывода, а в строку string. Это позволяет собирать в одну строку данные совершенно разных типов. Функция sscanf() Формат функции: sscanf(string, Control, arg1, arg2, ... , argn); Эта функция аналогична scanf(), за исключением того, что входные данные для ее работы поступают не со стандартного устройства ввода, а из строки string. Это позволяет выделять в строке различные группы данных совершенно разных типов и помещать их в отдельные переменные.

  1. Функция cprintf()

Формат этой функции совпадает с форматом функции printf(): сprintf(Control, arg1, arg2, ... , argn);

Параметры аналогичны параметрам printf(). Но для обеспечения работы этой функции следует подключить к программе файл conio.h, выполнив #include Если функция printf() выводит данные туда, куда назначен stdout, то функция cprintf() всегда выводит данные на консоль (на это указывает символ 'с' в начале ее имени), т.е. на экран. В отличие от printf(), функция cprintf() не переводит символ '\n' в пару "\r\n" – возврат каретки и перевод строки (вместо '\n' надо указывать оба этих символа). Кроме того, символы табуляции '\t' не преобразуются в пробелы. Эту функцию не рекомендуется использовать для приложений Win32 или Win32 GUI. Но ee можно использовать для выдачи на экран цветных сообщений. Для этого надо воспользоваться функциями textcolor() (установить цвeт текста) и textbackground() (установить цвет фона).

  1. Функция gets()

Формат функции: gets(s);

Осуществляет ввод символов с клавиатуры и записывает их в строку s, которую можно объявить как char *s или char s[].

  1. Функция puts()

Формат функции: puts(s);

Выводит содержимое строки s на устройство стандартного вывода (экран). Строка s может быть объявлена как char *s или char s[].

  1. Функция cputs()[24]

Формат функции: сputs(s);

Выводит содержимое строки s на экран (s может быть объявлена как char *s или char s[]). Эту функцию можно использовать для вывода на экран цветных текстов. Цвет выводимых символов задается с помощью функции textcolor(), а цвет фона – функцией textbackground(). Для работы функции надо подключить файл conio.h.

  1. Функция gotoxy()

Формат функции: gotoxy(x, y);

Переводит курсор в точку с координатами (x, y) в текущем окне на экране, где х – номер столбца экрана, y – номер строки экрана. Обе переменные должны быть описаны как int (не в пикселах). Для работы функции надо подключить файл conio.h.[25]


  1. Функция clrscr()

Формат функции: clrscr();

Очищает экран и окрашивает задний фон цветом который был указан в функции textbackground().

2. Ввод и вывод в языке С++

После рассмотрения назначений, правил и функций отвечающих за операции ввода/вывода в обычном языке C, можно приступить к теме работы «Ввод и вывод в языке С++». Далее мы будем описывать роль и значение функций отвечающих за ввод и вывод в С++, а также правила их использования.

Функция ввода и вывода выполнена в С++ с помощью классов, в которых содержатся методы и данные необходимые для работы. Все поточные классы происходят от общего предка – класса ios и потому наследуют его функциональность.[26] Для того чтобы начать создание программы с вводом/выводом необходим класс:

#include <fstream>

Данный класс fstream является потомком классов istream и ostream. Эти же классы являются родителями классов ifstream и оfstream. Класс fstream используется для организации ввода/вывода (т. е. чтения-записи) в один и тот же файл. Классы ifstream, оfstream – для организации соответственно ввода (чтения) файла и вывода (записи в файл). Также, классы istream, ostream являются cin, cout, cerr, и с их помощью осуществляется стандартный ввод и вывод – стандартным вводом считается ввод данных с клавиатуры, а стандартным выводом вывод информации на экран. Таким образом, включения в программу класса fstream оказывается достаточным для организации как стандартного, так и файлового ввода/вывода. Файловый ввод/вывод организован с помощью переопределенных в поточных классах операций включения (<>).[27]

Для начала работы с файлом необходима сперва его открыть а затем связать с функцией в которой задаем характеристики файла. Например: размер буфера ввода/вывода, состояние файла, последняя прочитанная запись и т. п. Связывание файла выполняет функция open(), входящая в один из классов, который определяет ввод/вывод (fstream, istream, ostream). Поэтому, чтобы выполнить эту функцию, следует сначала создать экземпляр соответствующего класса, чтобы получить доступ к этой функции. Например мы хотим сделать какую-либо запись в файле, тогда следует создать экземпляр класса ostream: ostream exp; и затем выполнить функцию

exp.open().[28]

В скобках обязательно должны быть указаны параметры функции: имя открываемого файла и способ открытия файла, в котором задаются сведения о том, как пользователь собирается работать с файлом: читать его, писать в него или делать что-то еще. После того как файл открыт для чтения или записи, используют операции включения извлечения (<>). Если использовать пример с экземпляром exp класса ostream, то можно записать, например:


exp << "строка текста" << i << j << endl;

Здесь i, j — некоторые переменные (например, int i; float j;), endl – конец вывода и переход на новую строку. После того как необходимая работа с файлом закончена, надо отвязать файл от той структуры к которой его привязали при открытии, закрыв его. Если мы этого не сделаем, то открыть и работать с другим файлом не получится. Для закрытия файла нужно воспользоваться методом close() того же экземпляра класса, который мы создавали, чтобы выполнить функцию open().[29] В нашем случае следовало бы написать:

exp.close();

Файловый ввод/вывод с использованием разных классов

Поточные классы – это поставщики инструментов для работы с файлами. В поточных классах находятся:

  • структуры, необходимые для открытия и закрытия файлов;
  • функции (методы) открытия и закрытия файлов;
  • другие функции и данные, производящие различные виды ввода-вывода;

В языке С++ для использования проточных классов необходимо написать команду:

using namespace::std;

В противном случае программа не пройдет компиляцию. В листинге 1 приводится пример использования директив пространства имен.[30]

Листинг 1.

#include <vcl.h>

#include <iostream>

#include <conio.h>

namespace F

{

float x = 9;

}

namespace G

{

using namespace F;

float y = 2.0;

namespace INNER_G

{

float z = 10.01;

}[31]

}

int main()

{

using namespace G;

using namespace G::INNER_G;

float x = 19.1;

std::cout << "x = " << x << std::endl;

std::cout << "y = " << y << std::endl;

std::cout << "z = " << z << std::endl;

getch();

return 0;

}

В результате на экране появится:

x = 19.1

y = 2

z = 10.01[32]

std::cout – это стандартный вывод. Здесь показано, что объект cout принадлежит пространству имен std.

Работа с классом fstream.

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

Этот класс имеет следующие основные функции (методы):

open() – открывает файл;

close() – закрывает файл;

is_open() – если файл уже открыт, то возвращает true, иначе — false;

rdbuf() – ставит указатель на буфер ввода/вывода.

Формат функции open(): open(char* file_name, open_mode);

где file_name – имя открываемого файла, open_mode – способ открытия файла. Режим работы с файлом после открытия устанавливается с помощью различных переменных: enum open_mode {app, binary, in, out, trunc, ate}; Эта переменная определена в базовом классе ios, поэтому обращение к перечислимым значениям в классе fstream, с экземпляром которого мы работаем, должно идти с указанием класса-родителя: ios::app, ios::binary и т. д.[33]