Добавлен: 14.06.2023
Просмотров: 186
Скачиваний: 2
- d – аргумент преобразуется к десятичному виду (с учетом знака);
- x – аргумент преобразуется в беззнаковую шестнадцатеричную форму;
- U – аргумент преобразуется в беззнаковую десятичную форму;
- с – аргумент рассматривается как отдельный символ;
- s – аргумент рассматривается как строка символов; символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности;
- е – аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в экспонентном виде;
- f – аргумент рассматривается как переменная типа float или double иρ преобразуется в десятичную форму;
- n – указатель на целое со знаком;
- p – входной аргумент выводится как указатель.
Между границами формата вывода (от знака % до символа-спецификатора типа выводимого аргумента) находятся:
[флажки][ширина][.точность][F|N|h|l|L]
- Функция scanf()
Формат функции: scanf(Control, arg1, arg2, ... , argn);
Это функция форматного ввода с клавиатуры. Осуществляет посимвольный ввод данных с клавиатуры, преобразует их в соответствии с форматом для каждого значения, указанном в управляющей (форматной) символьной строке Control, и результат преобразования записывает в аргументы arg1, arg2, ..., argn. Смысл строки Control тот же, что и для функции printf(). Так как arg1, arg2, ..., argn – это выходные параметры функции, то при обращении к функции они должны задаваться своими адресами: имена массивов задаются именами, т. к. имя массива — это указатель на его первый элемент, а те аргументы, которые не являются указателями, задаются как &arg. Форматная строка Control – это символьная строка, содержащая три типа объектов: незначащие символы, значащие символы и спецификации формата. Незначащие символы – это пробел, знак табуляции (\t), символ перехода на новую строку (\n). Как только функция встречает незначащий символ в строке формата, она считывает, но не сохраняет все последующие незначащие символы до тех пор, пока не встретится первый значащий символ (т. е. пропускает незначащие символы). Значащие символы – это все символы кода ASCII, кроме символа '%'. Если функция встречает в форматной строке значащий символ, она его считывает, но не сохраняет. Спецификация формата функции имеет вид:
%[*][ширина][F/N] [h/l] символ_формата
- Функция sprintf()
Формат функции такой: sprintf(string, Control, arg1, arg2, ... , argn);
Эта функция аналогична printf(), за исключением того, что результат своей работы она выводит не на стандартное устройство вывода, а в строку string. Это позволяет собирать в одну строку данные совершенно разных типов. Функция sscanf() Формат функции: sscanf(string, Control, arg1, arg2, ... , argn); Эта функция аналогична scanf(), за исключением того, что входные данные для ее работы поступают не со стандартного устройства ввода, а из строки string. Это позволяет выделять в строке различные группы данных совершенно разных типов и помещать их в отдельные переменные.
- Функция cprintf()
Формат этой функции совпадает с форматом функции printf(): сprintf(Control, arg1, arg2, ... , argn);
Параметры аналогичны параметрам printf(). Но для обеспечения работы этой функции следует подключить к программе файл conio.h, выполнив #include Если функция printf() выводит данные туда, куда назначен stdout, то функция cprintf() всегда выводит данные на консоль (на это указывает символ 'с' в начале ее имени), т.е. на экран. В отличие от printf(), функция cprintf() не переводит символ '\n' в пару "\r\n" – возврат каретки и перевод строки (вместо '\n' надо указывать оба этих символа). Кроме того, символы табуляции '\t' не преобразуются в пробелы. Эту функцию не рекомендуется использовать для приложений Win32 или Win32 GUI. Но ее можно использовать для выдачи на экран цветных сообщений. Для этого надо воспользоваться функциями textcolor() (установить цвет текста) и textbackground() (установить цвет фона).
- Функция gets()
Формат функции: gets(s);
Вводит строку символов с клавиатуры и записывает ее в строку s, которая может быть объявлена как char *s или char s[].
- Функция puts()
Формат функции: puts(s);
Выводит содержимое строки s на устройство стандартного вывода (экран). Строка s может быть объявлена как char *s или char s[].
- Функция cputs()
Формат функции: сputs(s);
Выводит содержимое строки s на экран (s может быть объявлена как char *s или char s[]). Эту функцию можно использовать для вывода на экран цветных текстов. Цвет выводимых символов задается с помощью функции textcolor(), а цвет фона – функцией textbackground(). Для работы функции надо подключить файл conio.h.
- Функция gotoxy()
Формат функции: gotoxy(x, y);
Переводит курсор в точку с координатами (x, y) в текущем окне на экране, где х – номер столбца экрана, y – номер строки экрана. Обе переменные должны быть описаны как int (не в пикселах). Для работы функции надо подключить файл conio.h.
- Функция clrscr()
Формат функции: clrscr();
Очищает экран и закрашивает его цветом, заданным функцией textbackground().
2. Ввод и вывод в языке С++
Ввод и вывод в С++ организован с помощью так называемых поточных классов, содержащих данные и методы работы с файлами по вводу/выводу. Поточные классы происходят от общего предка – класса ios и потому наследуют его функциональность. Чтобы начать писать программу с использованием ввода/вывода на языке С++, следует обязательно выполнить в программе:
#include <fstream>
Класс fstream является потомком классов istream и ostream. Эти же классы являются родителями классов ifstream и оfstream. Класс fstream используется для организации ввода/вывода (т. е. чтения-записи) в один и тот же файл. Классы ifstream, оfstream – для организации соответственно ввода (чтения) файла и вывода (записи в файл). В свою очередь, экземплярами классов istream, ostream являются cin, cout, cerr, с помощью которых осуществляется так называемый стандартный ввод/вывод – ввод со стандартного вводного устройства, которым по умолчанию является клавиатура, и вывод на стандартное выводное устройство, которым по умолчанию является экран. Таким образом, включения в программу класса fstream оказывается достаточным для организации как стандартного, так и файлового ввода/вывода. Файловый ввод/вывод организован с помощью переопределенных в поточных классах операций включения (<>).
Чтобы работать с файлом, его сначала следует открыть – связать со специальной структурой, в которой задаются характеристики файла (размер буфера ввода/вывода, состояние файла, последняя прочитанная запись и т. п.). Связь эта выполняется с помощью функции open(), входящей в один из классов, который определяет ввод/вывод (fstream, istream, ostream). Поэтому, чтобы выполнить такую функцию, следует сначала создать экземпляр соответствующего класса, чтобы получить доступ к этой функции. Если мы, например, хотим выполнять вывод в файл (т. е. запись в него), то следует создать экземпляр класса ostream: ostream exp; и затем выполнить функцию
exp.open().
В скобках должны быть указаны параметры этой функции: имя открываемого файла и способ открытия файла, в котором задаются сведения о том, как пользователь собирается работать с файлом: читать его, писать в него или делать что-то еще. После того как файл открыт для чтения или записи, используют операции включения извлечения (<>). Если использовать пример с экземпляром exp класса ostream, то можно записать, например:
exp << "строка текста" << i << j << endl;
Здесь i, j — некоторые переменные (например, int i; float j;), endl – конец вывода и переход на новую строку. После того как работа с файлом закончена, следует закрыть файл, чтобы разорвать связь с той структурой, с которой файл был связан при его открытии. Это необходимо, чтобы дать возможность другим файлам "открываться". Этот акт выполняется с помощью метода close() того же экземпляра класса, который мы создавали, чтобы выполнить функцию open(). В нашем случае следовало бы написать:
exp.close();
2.1 Файловый ввод/вывод с использованием разных классов
Поточные классы – это поставщики инструментов для работы с файлами. В поточных классах хранятся:
- структуры, обеспечивающие открытие/закрытие файлов;
- функции (методы) открытия/закрытия файлов;
- другие функции и данные, обеспечивающие собственно ввод/вывод.
При использовании поточных классов языка С++ в основной программе требуется писать директиву:
using namespace::std;
В противном случае программа не пройдет компиляцию. В листинге 1 приводится пример использования директив пространства имен.
Листинг 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;
}
}
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
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 и т. д.
2.2 Назначение способов открытия файла
app – открыть файл для дозаписи в его конец;
binary – открыть файл в бинарном виде (такие файлы были записаны по определенной структуре данных и поэтому должны читаться по этой же структуре);
in — открыть файл для чтения;
out – открыть файл для записи в его начало. Если файл не существует, он будет создан;
trunc – уничтожить содержимое файла, если файл существует (очистить файл);
ate – установить указатель позиционирования файла на его конец.
При задании режимов открытия файла можно применять оператор логического ИЛИ (|), чтобы составлять необходимое сочетание режимов открытия. Приведем пример программы работы с классом fstream (листинг 2). Результат работы показан на рисунке 1.
Листинг 2.
#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <fstream>
#include <stdio.h>
void main()
{
using namespace std;
fstream inout;
inout.open("fstream.out", ios_base::in | ios_base::out | ios_base::trunc);
inout << "This is the story1 of a man" << endl;
inout << "This is the story2 of a man" << endl;
inout << "This is the story3 of a man" << endl;
char p[100];
inout.seekg(0);
inout.getline(p, 100);
cout << endl << "String1 :" << endl;
cout << p;
fstream::pos_type pos = inout.tellg();
inout.getline(p, 100);
cout << endl << "String2 :" << endl;
cout << p;
inout.getline(p, 100);
cout << endl << "String3 :" << endl;
cout << p;
inout.seekp(pos);
inout << "This is the story2 of a man" << endl;
inout << "This is the story3 of a man" << endl;
inout.seekg(0);
cout << endl << endl << inout.rdbuf();
inout.close();
system("DEL FSTREAM.OUT");
getch();
}
Рисунок 1.
- Работа с классом ofstream
Класс ofstream предназначен для организации работ по выводу (записи) в файл с помощью методов этого класса:
open() – открывает файл для записи в него информации;
is_open() – возвращает true, если файл открыт, и false – в противном случае;
put() – записывает в файл один символ;
write() – записывает в файл заданное число символов;
skeep() – перемещает указатель позиционирования в заданное место файла;
tellp() – выдает текущее значение указателя позиционирования;
close() – закрывает файл;
rdbuf() – выдает указатель на буфер вывода (этот буфер находится в структуре, с которой связывается файл при его открытии).
В листинге 3 приведен пример использования класса ofstream.
Листинг 3.
ofstream FILE;
FILE.open("a.txt");
if(FILE == NULL) return(0);
for(int i = 0; i < 2; i++)
FILE << "string " << i << endl;
FILE.close();
- Работа с классом ifstream
Класс ifstream предназначен для организации работ по вводу (чтению) из файла с помощью методов этого класса:
open() – открывает файл для чтения из него информации;
is_open() – возвращает true, если файл открыт, и false – в противном случае;
get() – читает из файла один символ;
read() – читает из файла заданное число символов;
eof() – возвращает ненулевое значение, когда указатель позиционирования в файле достигает конца файла;
peek() – выдает очередной символ потока, но не выбирает его (не сдвигает указатель позиционирования данного в файле);
seekg() – перемещает указатель позиционирования в заданное место файла;
tellg() – выдает текущее значение указателя позиционирования;
close() – закрывает файл;
rdbuf() – выдает указатель на буфер ввода (этот буфер находится в структуре, с которой связывается файл при его открытии).
Пример использования класса приведен в листинге 4.
Листинг 4.
ifstream FILE;
char p[100];
FILE.open("a.txt");
if(FILE == NULL) return(0);
while(!FILE.eof())
{
FILE >> p;
cout << p << endl;
}
FILE.close();