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

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

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

Добавлен: 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 - одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины выводимого числа, а количество цифр после десятичной точки зависит от требуемой точности. Знак числа при отсутствии модификатора '+' изображается только для отрицательного числа.