Добавлен: 26.05.2023
Просмотров: 275
Скачиваний: 2
Назначение способов открытия файла:
app – открывает файл и позволяет дописать данные в конец файла;
binary – открывает файл в бинарном виде (такие файлы были записаны по определенной структуре данных и поэтому чтобы из прочесть необходимо использовать туже структуру);
in — открыть файл для чтения;
out – открывает файл и позволяет записать данные в его начале, если открываемый файл не существует автоматически создает новый;
trunc – удаляет данные в существующем файле;[34]
ate – утанавливает указатель позиционирования файла в его конце.
При выборе режимов открытия файла можно применять оператор логического ИЛИ (|), чтобы сделать несколько режимов открытия, если требуется. Приведем пример программы работы с классом fstream (листинг 2). Результат работы показан на рисунке 1.
Листинг 2.
#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <fstream>
#include <stdio.h>
void main()
[35]{
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();
}[36]
Рис. 1 Результат работы кода
Работа с классом ofstream
Класс ofstream используется для организации задач по выводу (записи) в файл с помощью различных методов входящих в класс:
open() – открывает файл для записи в него информации;
is_open() –проверяет открыт ли файл, возвращает true, если файл открыт, и false – в противном случае;
put() – записывает в файл один символ;
write() – записывает в файл заданное число символов;
skeep() – перемещает указатель позиционирования в заданное место файла;
tellp() – выдает текущее значение указателя позиционирования;
close() – закрывает файл;
rdbuf() – выдает указатель на буфер вывода (этот буфер находится в структуре, с которой связывается файл при его открытии).
В листинге 3 приведен пример использования класса ofstream.[37]
Листинг 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.[38]
Листинг 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();
Стандартный ввод/вывод в С++
Стандартный ввод/вывод является частным случаем файлового ввода/вывода. Во время файлового ввода-вывода мы используем различные поточные классы с их операциями и методами << и >>. Но классы istream, ostream, которые лежат в основе поточных классов, содержат стандартные объекты-экземпляры классов с именами cout (экземпляр класса для стандартного ввода), cin (экземпляр класса для стандартного вывода) и сerr (экземпляр класса для стандартного вывода сообщений об ошибках).
Во время запуска программы в С++ эти стандартные потоки открыты и по умолчанию назначены на стандартные вводное и выводное устройства — клавиатуру (cin) и экран (cout и cerr). Причем эти устройства синхронно связаны с соответствующими указателями stdin, stdout, stderr. Так что работа со стандартным вводом/выводом сводится к тому, что вместо задаваемых пользователем имен экземпляров соответствующих классов задаются имена стандартных экземпляров классов: cin, cout. Открывать ничего не нужно, надо только использовать операции <> и операции форматирования. Если мы пишем имена переменных, из которых выводятся или в которые вводятся данные, то по умолчанию для ввода/вывода используются определенные форматы. [39]Например, запишем:
cout << i;
i выводится на экран в определенном формате, который определен по умолчанию для типа i и в минимальном поле.
Запишем:
cin >> i >> j >> s;
здесь i, j, s описаны соответственно как int, float, char. В записи не указаны форматы, но во время ввода с клавиатуры они будут укзаны (после ввода каждого значения надо нажимать клавишу ) и их форматы будут учтены.
Объект cout
Этот объект cout отправляет данные в буфер-поток, связанный с объектом stdout, объявленным в файле stdio.h. По умолчанию стандартные потоки С и С++ синхронизированы. Во время вывода, данные могут быть изменены или отформатированы с помощью функций-членов класса или манипуляторов. Перечень их приведен в таблице 1.[40]
Таблица 1.
|
Манипуляторы |
Функции-члены класса |
Описание |
|
showpos |
setf(ios::showpos) |
Выдает знак плюс у выводимых положительных чисел |
|
noshowpos |
unsetf(ios::showpos) |
— |
|
showbase |
setf(ios::showbase) |
Выдает базу системы счисления в выводимом числе в виде префикса |
|
noshowbase |
unsetf(ios::showbase) |
— |
|
uppercase |
setf(ios::uppercase) |
Заменяет символы нижнего регистра на символы верхнего регистра в выходном потоке |
|
nouppercase |
unsetf(ios::uppercase) |
— |
|
showpoint |
setf(ios::showpoint) |
Создает символ десятичной точки в сгенерированном потоке с плавающей точкой (в выводимом числе) |
|
noshowpoint |
unsetf(ios::showpoint) |
— |
|
boolalpha |
setf(ios::boolalpha) |
Переводит булевый тип в символьный |
|
noboolalpha |
unsetf(ios::boolalpha) |
— |
|
unitbuf |
setf(ios::unitbuf) |
Сбрасывает буфер вывода после каждой операции вывода |
|
nounitbuf |
unsetf(ios::unitbuf) |
— |
|
internal |
setf(ios::internal, ios::adjustfield) |
Добавляет символы-заполнители к определенным внутренним позициям выходного потока (речь идет о выводе числа в виде потока символов). Если такие позиции не определены, поток не изменяется |
|
left |
setf(ios::left, ios::adjustfield) |
Добавляет символы-заполнители с конца числа (сдвигая число влево) |
|
right |
setf(ios::right, ios::adjustfield) |
Добавляет символы-заполнители с начала числа (сдвигая число вправо) |
|
dec |
setf(ios::dec, ios::basefield) |
Переводит базу вводимых или выводимых целых чисел в десятичную (введенные после этого манипулятора данные будут выводиться как десятичные) |
|
hex |
setf(ios::hex, ios::basefield) |
Переводит базу вводимых или выводимых целых чисел в шестнадцатеричную (введенные после этого манипулятора данные будут выводиться как шестнадцатеричные) |
|
oct |
setf(ios::oct, ios::basefield) |
Переводит базу вводимых или выводимых целых чисел в восьмеричную (введенные после этого манипулятора данные будут выводиться как восьмеричные) |
|
fixed |
setf(ios::fixed, ios::floatfield) |
Переводит выход с плавающей точкой в выход с фиксированной точкой |
|
scientific |
setf(ios::scientific, ios::floatfield) |
Выдает числа с плавающей точкой в виде, используемом в научных целях: например, число 23450000 будет записано как: 23.45e6 |
|
fill(c) |
setfill(char_type c) |
Задает символ заполнения при выводе данных |
|
precision(n) |
setprecision(int n) |
Задает точность вывода данных (количество цифр после точки) |
|
setw(int n) |
width(n) |
Задает ширину поля для выводимых данных (количество символов) |
|
endl |
Вставляет символ новой строки ('\n') в выходную последовательность символов и сбрасывает буфер ввода |
|
|
ends |
Вставляет символ '\0' в выходную последовательность символов |
|
|
flush |
flush() |
Сбрасывает буфер вывода |
|
ws |
Задает пропуск пробелов при вводе |
[41]Пример программы с применением объекта cout приведен на листинге 5. Результат работы представлен на рисунке 2.
Листинг 5.
#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <stdio.h>
void main()
{
using namespace std;
int i;
float f;
cout << "Enter i and f >" << endl;
cin >> i >> f;
cout << i << endl;
cout << f << endl;
cout << hex << i << endl;
cout << oct << i << dec << i << endl;
cout << showpos << i << endl;
cout << setbase(16) << i << endl;
cout << setfill('@') << setw(20) << left << dec << i;
cout << endl;
cout.fill('@');
cout.width(20);
cout.setf(ios::left, ios::adjustfield);
cout.setf(ios::dec, ios::basefield);
cout << i << endl;
cout << scientific << setprecision(10) << f << endl;
cout.precision(6);
cout << f << fixed << endl;
getch();
}[42]
Рис. 2 Результат работы кода
Стандартный ввод cin
Это объект cin который управляет вводом из буфера ввода, связанного с объектом stdin, объявленным в файле stdio.h. По умолчанию стандартные потоки в языках С и С++ синхронизированы. При вводе используется часть тех функций и манипуляторов, которые определены для cout. Это такие манипуляторы, как dec, hex, oct, ws и др.
Пример программы с использованием объекта cin приведен в листинге 6. Результат работы представлен на рисунке 3.
Листинг 6.
#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <stdio.h>
void main()
{
using namespace std;
int i;
float f;
char c;
cout << "Enter i,f,c and then input the string >" << endl;
cin >> i >> f >> c;
cout << i << endl << f << endl << c << endl;
char p[50];
cin >> ws >> p;
cout << p << endl;
cin.seekg(0);
cin.getline(p,50);
cout << p << endl;
getch();
}[43]
Рис. 3 Результат работы кода
3. Форматный ввод-вывод в С++
Во время работы со стандартными потоками ввода-вывода определены две функции:
printf( ) - форматный вывод;
scanf( ) - форматный ввод.
Прототип функции printf() имеет вид:
int printf(const char *format,...);
При обращении к функции printf() возможно установить два вида задания:
int printf ( *форматная строка, список_аргументов);
int printf (указателъ_на_форматную_строку,. список_аргументов); [44]
В обох из них printf() преобразует данные из внутреннего представления в символьный вид в соответствии с форматной строкой и выводит их в выходной поток. Данные, которые преобразуются и выводятся, задаются как аргументы функции printf().
Возвращаемое значение функции printf() – количество напечатанных знаков; а в случае ошибки - отрицательное число.
Также есть форматная строка которая ограничена двойными кавычками куда можно ввести произвольный текст, символы управления и вид работы с данными. Текст и управляющие символы из форматной строки просто копируются в выходной поток.[45] Форматная строка обычно размещается в списке фактических параметров функции, что соответствует первому варианту вызова функции printf(). Во втором же варианте, первый фактический параметр - это указатель типа char *, и форматная строка определена в программе как обычная строковая константа или переменная.
В списке аргументов функции printf() находятся выражения, значения которых надо вывести из программы. Частные случаи этих выражений - переменные и константы. Количество аргументов и их типы должны соответствовать последовательности спецификаций преобразования в форматной строке. Для каждого аргумента должна быть указана точно одна спецификация преобразования. [46]
Если аргументов недостаточно для данной форматной строки, то результат зависит от реализации (от операционной системы и от системы программирования). Если аргументов больше, чем указано в форматной строке, "лишние" аргументы игнорируются. Гарантируется, что при любом количестве параметров и любом их типе после выполнения функций printf() дальнейшее выполнение программы будет корректным. [47]
Спецификация преобразования имеет следующую форму:
% флаги ширина_поля. точностъ спецификатор
Символ % является признаком спецификации преобразования. В спецификации преобразования обязательными являются только два элемента: признак % и спецификатор.
Спецификатор Тип аргумента Формат вывода
d int, char,unsigned Десятичное целое со знаком
u int, char,unsigned Десятичное целое без знака
o int, char,unsigned Восьмеричное целое без знака
x int, char,unsigned Шестнадцатеричное целое без знака; при выводе используются символы “0..9a..f”
X int, char,unsigned Шестнадцатеричное целое без знака; при выводе используются символы "0...9A...F”
f double, float Вещественное значение со знаком в виде:
Знак_числа dddd.dddd
где dddd - одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины выводимого числа, а количество цифр после десятичной точки зависит от требуемой точности. Знак числа при отсутствии модификатора '+' изображается только для отрицательного числа.