Параметризованные манипуляторы
Ниже перечислены манипуляторы, требующие указания аргумента. Для их использования требуется подключить к программе заголовочный файл <iomanip>.
setbase(int n) | — задает основание системы счисления (п = 8, 16, 10 или 0). 0 является основанием по умолчанию (десятичное, кроме случаев, когда вводятся 8- или 16-ричные числа); |
resetiosflags(long) | — сбрасывает флаги состояния потока, биты которых установлены в параметре; |
setiosflags(long) | — устанавливает флаги состояния потока, биты которых в параметре равны 1; |
setfill (int) | — устанавливает символ-заполнитель с кодом, равным значению параметра; |
setprecision(int) | — устанавливает максимальное количество цифр в дробной части для вещественных чисел в форме с фиксированной точкой (флаг fixed) или общее количество значащих цифр для чисел в форме с мантиссой и порядком (флаг scientific); |
setw(int) | — устанавливает максимальную ширину поля вывода. |
Пример использования параметризованных манипуляторов. Для эго приведем пример, которая делает аналогичный форматированный вывод информации о студентах, только формат вывода чисел установи в виде мантиссы с порядком
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
const int n=2;
//Создадим структуру для хранения информации о студентах с двумя полями ФИО и средний бал успеваимости
struct Tstudent
{
char FIO[20];
float bal;
}StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3};
int main (int argc, char * const argv[])
{
for(int i=0;i<n;i++)
{
cout<<resetiosflags(ios::right);// то же что и cout.unsetf(ios::right);
cout<<setiosflags(ios::left); // то же что и cout.setf(ios::left);
cout<<setfill('.'); //то же что и cout.fill('.');
cout<<setw(15); // то же что и cout.width(15);
cout<<setiosflags(ios::fixed); //то же что и cout.setf(ios::fixed);
cout<<setiosflags(ios::scientific);// cout.setf(ios::scientific);
cout<<resetiosflags(ios::fixed);// cout.unsetf(ios::scientific);
cout<<setprecision(3); //то же что и cout.setf(ios::scientific);
cout <<StudetnPotok[i].FIO;//выводим фамилию
cout<<setw(10); //тоже самое что и cout.width(10)
cout<<setiosflags(ios::right);// то же что и cout.setf(ios::right);
cout<<setfill('_'); //cout.fill('_')
cout<<StudetnPotok[i].bal<<'\n';
}
cin.get();
return 0;
}
Этот фрагмент выведет на экран следующий результат:
Petrov........._3.500e+00
Sidorov........_1.667e+00
Используя манипуляторы методы можно объединять. Следующий фрагмент кода делает тот же самый вывод за исключением того что изменен формат вывода чисел
#include <iostream>
#include <iomanip>
using namespace std;
const int n=2;
struct Tstudent
{
char FIO[20];
float bal;
}StudetnPotok[n]={"Petrov",3.5,"Sidorov",5.0/3};
int main (int argc, char * const argv[])
{
for(int i=0;i<n;i++)
{
cout<<resetiosflags(ios::right)<<setiosflags(ios::left)<<setfill('.')
<<setw(15)<<StudetnPotok[i].FIO;
cout<<setprecision(3)<<setw(10)<<setiosflags(ios::right|ios::fixed)
<<setfill('_')<<StudetnPotok[i].bal<<'\n';
}
cin.get();
return 0;
}
Этот фрагмент выведет на экран следующий результат:
Petrov........._______3.500
Sidorov........______1.667
Наведем пример, как с помощью флагов, методов и манипуляторов потока можно создать собственную функцию для форматированного вывода специализированных данных
Пусть у нас имеется информация о студентах, которую необходимо выводить пользователю в удобном виде
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
const int n=2;
//Создадим структуру для хранения информации о студентах с двумя полями ФИО и средний бал успеваимости
struct Tstudent
{
char FIO[20];
float bal;
}Stud[n]={"Petrov",3.5,"Sidorov",5.0/3};
void myOut(ostream &out,Tstudent *StudetnPotok,int n)
{
for(int i=0;i<n;i++)
{
cout<<resetiosflags(ios::right)<<setiosflags(ios::left)
<<setfill('.')<<setw(15)<<StudetnPotok[i].FIO;
cout<<setw(10)<<setiosflags(ios::right|ios::fixed)
<<setfill('_')<<StudetnPotok[i].bal<<'\n';
}
}
int main (int argc, char * const argv[])
{
//Этот фрагмент выведет на экран следующий результат:
myOut(cout,Stud,n);
ofstream fileout("o.txt");
myOut(fileout,Stud,n);
return 0;
}
Методы обмена с потоками
В потоковых классах наряду с операциями извлечения >> и включения << определены методы для неформатированного чтения и записи в поток (при этом преобразования данных не выполняются). Ниже приведены функции чтения, определенные в классе istream.
gcount() | — возвращает количество символов, считанных с помощью последней функции неформатированного ввода; |
get() | — возвращает код извлеченного из потока символа или EOF; |
get (с) | — возвращает ссылку на поток, из которого выполнялось чтение, и записывает извлеченный символ в с; |
get(buf,num,lim='\n') | — считывает num-1 символов (или пока не встретится символ lim) и копирует их в символьную строку buf. Вместо символа lime строку записывается признак конца строки ('\0'). Символ lim остается в потоке. Возвращает ссылку на текущий поток; |
getline(buf, num, lim='\n') | — аналогична функции get, но копирует в buf и символ lim; |
ignore(num = 1, lim = EOF) | — считывает и пропускает символы до тех пор, пока не будет прочитано num символов или не встретится разделитель, заданный параметром lim. Возвращает ссылку на текущий поток; |
peek() | — возвращает следующий символ без удаления его из потока или EOF, если достигнут конец файла; |
putback(c) | — помещает в поток символ с, который становится текущим при извлечении из потока; |
read(buf, num) | — считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает ссылку на текущий поток; |
readsome(buf, num) | — считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает количество считанных символов; |
seekg(pos) | — устанавливает текущую позицию чтения в значение pos; |
seekg(offs, org) | — перемещает текущую позицию чтения на offs байтов, считая от одной из трех позиций, определяемых параметром org: ios::beg (от начала файла), ios::cur (от текущей позиции) или ios::end (от конца файла); |
tellg() | — возвращает текущую позицию чтения потока; |
unget() | — помещает последний прочитанный символ в поток и возвращает ссылку на текущий поток. |
В классе ostream определены аналогичные функции для неформатированного вывода:
flush() | — записывает содержимое потока вывода на физическое устройство; |
put(с) | — выводит в поток символ с и возвращает ссылку на поток; |
seekg(pos) | — устанавливает текущую позицию записи в значение pos; |
seekg (offs, org) | — перемещает текущую позицию записи на offs байтов, считая от одной из трех позиций, определяемых параметром org: ios::beg (от начала файла), ios::cur (от текущей позиции) или ios::end (от конца файла); |
tellg() | — возвращает текущую позицию записи потока; |
write(buf, num) | — записывает в поток num символов из массива buf и возвращает ссылку на поток. |
Ошибки потоков
В базовом классе ios определено поле state, которое представляет собой состояние потока в виде совокупности битов:
enum io_state {
goodbit = 0x00, // Нет ошибок
eofbit = 0x01, // Достигнут конец файла
fail bit = 0x02, // Ошибка форматирования или преобразования
badbit = 0x04, // Серьезная ошибка, после которой
// пользоваться потоком невозможно
hardfail = 0x08 // Неисправность оборудования
}:
Состоянием потока можно управлять с помощью перечисленных ниже методов и операций:
int rdstate() | — возвращает текущее состояние потока; |
int eof() | — возвращает ненулевое значение, если установлен флаг eofbit; |
int fail() | — возвращает ненулевое значение, если установлен один из флагов failbit, badbit или hardfail; |
int bad() | — возвращает ненулевое значение, если установлен один из флагов badbit или hardfail; |
int good() | — возвращает ненулевое значение, если сброшены все флаги ошибок; |
void clear(int = 0) | — параметр принимается в качестве состояния ошибки, при отсутствии параметра состояние ошибки устанавливается 0; |
operator void*() | — возвращает нулевой указатель, если установлен хотя бы один бит ошибки; |
operator !() | — возвращает ненулевой указатель, если установлен хотя бы один бит ошибки. |
Далее приведены часто используемые операции с флагами состояния потока.
// Проверить, установлен ли флаг flag;
if(stream_obj.rdstate() & ios::flag)
// Сбросить флаг flag:
stream_obj.clear(rdstate() & ~ios::flag)
// Установить флаг flag:
stream_obj.clear(rdstate() | ios::flag)
// Установить флаг.flag и сбросить все остальные:
stream_obj.clear(ios::flag)
// Сбросить все флаги:
stream_obj.clear()
Операция vo1d*() неявно вызывается всякий раз, когда поток сравнивается с 0. Это позволяет записывать циклы вида:
while (stream_obj){
// Все в порядке, можно производить ввод/вывод
}
Файловые потоки
Под файлом обычно подразумевается именованная информация на внешнем носителе, например, на жестком или гибком магнитном диске. Логически файл можно представить как конечное количество последовательных байтов, поэтому такие устройства, как дисплей, клавиатуру и принтер также можно рассматривать как частные случаи файлов.
По способу доступа файлы можно разделить на последовательные, чтение и запись в которых производятся с начала байт за байтом, и файлы с произвольным доступом, допускающие чтение и запись в указанную позицию.
Стандартная библиотека содержит три класса для работы с файлами: ifstream — класс входных файловых потоков; ofstream — класс выходных файловых потоков; fstream — класс двунаправленных файловых потоков.
Эти классы являются производными от классов i stream, ostream и iostream соответственно, поэтому они наследуют перегруженные операции « и », флаги форматирования, манипуляторы, методы, состояние потоков и т. д.
Использование файлов в программе предполагает следующие операции:
- создание потока;
- открытие потока и связывание его с файлом;
- обмен (ввод/вывод); - уничтожение потока;
- закрытие файла.
Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами.
- Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом:
ifstream(); ofstream(); fstream();
- Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом:
ifstream(const char *name. int mode = ios::in);
ofstream(const char *name, int mode - ios::out | ios::trunc);
fstream(const char *name. int mode - ios::in | ios::out);
Вторым параметром конструктора является режим открытия файла. Если установленное по умолчанию значение не устраивает программиста, можно указать другое, составив его из битовых масок, определенных в классе ios:
enum open_mode
{
in = 0x01, // Открыть для чтения
out = 0x02, // Открыть для записи
ate = 0x04, // Установить указатель на конец файла
арр = 0x08, // Открыть для добавления в конец
trunc = 0x10, // Если файл существует, удалить
nocreate = 0x20, // Если файл не существует, выдать ошибку
noreplace = 0x40, // Если файл существует, выдать ошибку
binary = 0x80 // Открыть в двоичном режиме
};
Открыть файл в программе можно с использованием либо конструкторов, либо метода open, имеющего такие же параметры, как и в соответствующем конструкторе, например:
ifstream inpf("input.txt", , ios::in|ios::nocreate); //Использование конструктора
if (!inpf)
{
cout << "Невозможно открыть файл для чтения"; return 1;
}
ofstream f;
f.open("output.txt"); // Использование метода open
if (!f)
{
cout << "Невозможно открыть файл для записи"; return 1;
}
Чтение и запись выполняются либо с помощью операций чтения и извлечения, аналогичных потоковым классам, либо с помощью методов классов.
Пример использования методов (программа выводит на экран содержимое файла):
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char text[81], buf[81];
cout << "Введите имя файла:";
cin >> text;
ifstream f(text, ios::in);
if (!f)
{
cout << "Ошибка открытия файла"; return 1;
}
while (!f.eof())
{
f.getline(buf, 81);
cout << buf << endl;
}
cin.get();
cin.get();
return 0;
}
Для закрытия потока определен метод close(), но поскольку он неявно выполняется деструктором, явный вызов необходим только тогда, когда требуется закрыть поток раньше конца его области видимости.
}
Для закрытия потока определен метод close(), но поскольку он неявно выполняется деструктором, явный вызов необходим только тогда, когда требуется закрыть поток раньше конца его области видимости.
У попередніх програмах запис даних у файл і їх читання з файла здійснювалось послідовно поелементно. Але записати або прочитати декілька даних (наприклад, масив чисел) можна однією операцією.
Для цього необхідно створити бінарний файл і записати та считати данні відповідними функціями:
in.write((char*)&p,sizeof(p)); — при запису даних у файл,
out.read((char*)&p,sizeof(p)); — при читанні даних з файлу ,
тут іn —ім’я потоку введення, out - виведення; р –—змінна будь – якого типу (але не масиву).
Для запису елементів масиву необхідно використовувати іншу конструкцію
in.write((char*)p,sizeof(*p)*n); — при запису даних у файл,
out.read((char*)p,sizeof(*p)*n); — при читанні даних з файлу ,
де – n кількість елементів масиву.
Подсчитать количество символов, слов, строк в файле
#include <iostream>
#include <fstream>
using namespace std;//пространство имен std
void createTestFile(const char* fileName)
{
ofstream out(fileName);
out<<"test file test file \ntest file ";
}
int main()
{
cout<<"Начало"<<endl;
createTestFile("testFile.txt");
ifstream innn("testFile.txt");//файл для чтения
if (!innn)
{
cerr<<"Не удалось открыть файл\n";
return 1;
}
int n=0;
while (!innn.eof())//пока не конец файла
//количесвто символов в файле
{
innn.get();//считывам 1 символ. Указатель файла
//автоматически смещается на следующий элемент
n++;//увеличиваем счетчик на 1
}
cout<<n<<endl;//выводим результат
n=0;//сбрасываем счетчик для подсчета количесво слов в файле
char str[300];//создаем временную переменную
//для хранения строки
innn.clear();//сбрасываем флаги потока отвечающие за ошибки
//после того как указатель файла достиг его конца
//автоматически устанавливается соответствующий флаг
//и если его не сбросить ничего с файла
//считать больше не возможно
innn.seekg(0);//перемещаем указатеь на начало файла
while (!innn.eof())//пока не конец файла начинаем
//с него считывать информацию
//количесвто слов в файле
{
innn>>str;//поток считывает слово до первого
//пробельного символа, если перед
// словом стоят пробелы они игнорируются
n++; //увеличиваем счетчик слов на 1
}
cout<<n<<endl;//выводим результат
//Подсчитаем сколько в предложении строк
n=0;//
innn.clear();
innn.seekg(0);
while (!innn.eof())
//количесвто строк в файле
{
innn.getline(str,300);//функция потока getline
//считывает строку
//до первого символа конца строки '\n'
//и помещает результат в str
n++;//увеличиваем счетчик строк на 1
}
cout<<n<<endl;//выводим результат
return 0;
}
Строковые потоки
Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как из файла, с консоли или на дисплей. В стандартной библиотеке определено три класса строковых потоков:
istringstream — входные строковые потоки; ostringstream — выходные строковые потоки; stringstream — двунаправленные строковые потоки.
Эти классы определяются в заголовочном файле <sstream>и являются производными от классов istream, ostreamи iostreamсоответственно.
Приведем пример использования строковых потоков. Занесем в строковый поток информацию об успеваемости студентов а потом выведем ее на экран.
#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
using namespace std;
const int n=2;
struct Tstudent
{
char FIO[20];
float bal;
}Stud[n]={"Petrov",3.5,"Sidorov",5.0/3};
int main ()
{
ostringstream mystr;
for(int i=0;i<n;i++)
{
mystr<<resetiosflags(ios::right)<<setiosflags(ios::left)<<setfill('.')
<<setw(15)<<Stud[i].FIO;
mystr<<setw(10)<<setiosflags(ios::right|ios::fixed)<<setfill('_')<<Stud[i].bal<<'\n';
}
cout<<mystr.str();//выводим информацию на экран .str()- является методом
//потока который возвращает строку типа string
//скопируем строку из потока в строку стиля языка С
char *str=new char [mystr.str().size()+1];// size() – метод возвращает длину
//строки типа string
strcpy(str,mystr.str().c_str()); // c_str() является методом строки типа string,
//который возвращает строку типа char*
cout<<str<<endl;
delete[]str;
cin.get();
return 0;
}
Порядок виконання роботи
2.4 Контрольні запитання та завдання
Завдання
Выполнить варианты заданий лабораторной работы при условии что исходные данные хранятся в текстовом файле. Необходимо считать исходные данные вывести их на экран и в файл в следующем формате: текстовое поле структуры должно быть выровнено по левому полю и занимать 15 знакомест, цифровое боле должно быть выровнено по правому полю и занимать 8 знакомест. Символ заполнитель ‘.’, например:
Сидоров................................3
Максименко.............................5
Исходные данные необходимо записать также в бинарный файл. Результаты обработки исходных данных необходимо сохранить в текстовый, бинарный файл, а также вывести на экран в удобном для пользователя виде.
Вывод исходной информации в поток оформить в виде функции.
2.6 Варіанти завдань
Вариант 1
Описать структуру с именем STUDENT, содержащую следующие поля: - фамилия и инициалы;
- номер группы;
- успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию номера группы;
- вывод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4.0;
- если таких студентов нет, вывести соответствующее сообщение.
Вариант 2
Описать структуру с именем STUDENT, содержащую следующие поля; - фамилия и инициалы;
- номер группы;
- успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла;
- вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5;
- если таких студентов нет, вывести соответствующее сообщение.
Вариант 3
Описать структуру с именем STUDENT, содержащую следующие поля:
- фамилия и инициалы; - номер группы;
- успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по алфавиту;
- вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2;
- если таких студентов нет, вывести соответствующее сообщение.
Вариант 4
Описать структуру с именем AEROFLOT, содержащую следующие поля:
- название пункта назначения рейса;
- номер рейса;
- тип самолета.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть упорядочены по возрастанию номера рейса;
- вывод на экран номеров рейсов и типов самолетов, вылетающих в пункт назначения, название которого совпало с названием, введенным с клавиатуры;
- если таких рейсов нет, выдать на дисплей соответствующее сообщение
Вариант 5
Описать структуру с именем AEROFLOT, содержащую следующие поля:
- название пункта назначения рейса;- номер рейса;
- тип самолета.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;
- вывод на экран пунктов назначения и номеров рейсов, обслуживаемых самолетом, тип которого введен с клавиатуры;
- если таких рейсов нет, выдать на дисплей соответствующее сообщение.
Вариант 6
Описать структуру с именем WORKER, содержащую следующие поля:
- фамилия и инициалы работника;
- название занимаемой должности;
- год поступления на работу.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; записи должны быть размещены по алфавиту;
-вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;
- если таких работников нет, вывести на дисплей соответствующее сообщение.
Вариант 7
Описать структуру с именем TRAIN, содержащую следующие поля:
- название пункта назначения;
- номер поезда;
- время отправления.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;
- вывод на экран информации о поездах, отправляющихся после введенного с клавиатуры времени;
- если таких поездов нет, выдать на дисплей соответствующее сообщение.
Вариант 8
Описать структуру с именем TRAIN, содержащую следующие поля:
- название пункта назначения;
- номер поезда;- время отправления.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из шести элементов типа TRAIN; записи должны быть упорядочены по времени отправления поезда;
- вывод на экран информации о поездах, направляющихся в пункт, название которого введено с клавиатуры;
- если таких поездов нет, выдать на дисплей соответствующее сообщение.
Вариант 9
Описать структуру с именем TRAIN, содержащую следующие поля:
- название пункта назначения;
- номер поезда;
- время отправления.
Написать программу, выполняющую следующие действия:
-ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть упорядочены по номерам поездов;
- вывод на экран информации о поезде, номер которого введен с клавиатуры;
- если таких поездов нет, выдать на дисплей соответствующее сообщение.
Вариант 10
Описать структуру с именем MARSH, содержащую следующие поля:
- название начального пункта маршрута;
- название конечного пункта маршрута;
- номер маршрута.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH; записи должны быть упорядочены по номерам маршрутов;
- вывод на экран информации о маршруте, номер которого введен с клавиатуры;
- если таких маршрутов нет, выдать на дисплей соответствующее сообщение.
Вариант 11
Описать структуру с именем MARSH, содержащую следующие поля:
- название начального пункта маршрута;
- название конечного пункта маршрута;
- номер маршрута.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH; записи должны быть упорядочены по номерам маршрутов;- вывод на экран информации о маршрутах, которые начинаются или оканчиваются в пункте, название которого введено с клавиатуры;
- если таких маршрутов нет, выдать на дисплей соответствующее сообщение.
Вариант 12
Описать структуру с именем NOTE, содержащую следующие поля:
- фамилия, имя;
- номер телефона;
- дата рождения (массив из трех чисел).
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по датам рождения;
- вывод на экран информации о человеке, номер телефона которого введен с клавиатуры;
- если такого нет, выдать на дисплей соответствующее сообщение.
Вариант 13
Описать структуру с именем NOTE, содержащую следующие поля:
- фамилия, имя;
- номер телефона;
- дата рождения (массив из трех чисел).
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть размещены по алфавиту;
- вывод на экран информации о людях, чьи дни рождения приходятся на месяц, значение которого введено с клавиатуры;
- если таких нет, выдать на дисплей соответствующее сообщение.
Вариант 14
Описать структуру с именем NOTE, содержащую следующие поля:
- фамилия, имя; - номер телефона;
- дата рождения (массив из трех чисел).
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по трем первым цифрам номера телефона;
- вывод на экран информации о человеке, чья фамилия введена с клавиатуры;
- если такого нет, выдать на дисплей соответствующее сообщение.
Вариант 15
Описать структуру с именем ZNAK, содержащую следующие поля:
- фамилия, имя;
- знак Зодиака;
- дата рождения (массив из трех чисел).
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по датам рождения;
- вывод на экран информации о человеке, чья фамилия введена с клавиатуры;
- если такого нет, выдать на дисплей соответствующее сообщение.
Вариант 16
Описать структуру с именем ZNAK, содержащую следующие поля:
- фамилия, имя;
- знак Зодиака;
- дата рождения (массив из трех чисел).
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по датам рождения;
- вывод на экран информации о людях, родившихся под знаком, название которого введено с клавиатуры!
- если таких нет, выдать на дисплей соответствующее сообщение.
Вариант 17
Описать структуру с именем ZNAK, содержащую следующие поля: - фамилия, имя;
- знак Зодиака;
- дата рождения (массив из трех чисел).
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по знакам Зодиака;
- вывод на экран информации о людях, родившихся в месяц, значение которого введено с клавиатуры;
- если таких нет, выдать на дисплей соответствующее сообщение.
Вариант 18
Описать структуру с именем PRICE, содержащую следующие поля:
- название товара;- название магазина, в котором продается товар;
- стоимость товара в руб.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE; записи должны быть размещены в алфавитном порядке по названиям товаров;
- вывод на экран информации о товаре, название которого введено с клавиатуры;
- если таких товаров нет, выдать на дисплей соответствующее сообщение
Вариант 19
Описать структуру с именем PRICE, содержащую следующие поля:
- название товара;
- название магазина, в котором продается товар;
- стоимость товара в руб.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE; записи должны быть размещены в алфавитном порядке по названиям магазинов;
- вывод на экран информации о товарах, продающихся в магазине, название которого введено с клавиатуры;
- если такого магазина нет, выдать на дисплей соответствующее сообщение.
Вариант 20
Описать структуру с именем ORDER, содержащую следующие поля:
- расчетный счет плательщика; - расчетный счет получателя;
- перечисляемая сумма в руб.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ORDER; записи должны быть размещены в алфавитном порядке по расчетным счетам плательщиков;
- вывод на экран информации о сумме, снятой с расчетного счета плательщика, введенного с клавиатуры;
- если такого расчетного счета нет, выдать на дисплей соответствующее сообщение.
Вариант 21
Описать структуру с именем STUDENT, содержащую следующие поля; - фамилия и инициалы;
- номер группы;
- успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла;
- вывод на дисплей фамилий и номеров групп для всех студентов, у которых успеваемость выше среднего;
Вариант 22
Описать структуру с именем STUDENT, содержащую следующие поля; - фамилия и инициалы;
- номер группы;
- успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла;
- вывод на дисплей фамилий и номеров групп для всех студентов, у которых успеваемость выше 2.0 бала и ниже 4.5.
Вариант 23
Описать структуру с именем PRICE, содержащую следующие поля:
- название товара;
- название магазина, в котором продается товар;
- стоимость товара в руб.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE;
- вывод на экран перечень магазинов, в которых есть в наличии товаре, название которого введено с клавиатуры;
- если таких товаров нет, выдать на дисплей соответствующее сообщение
Вариант 24
Описать структуру с именем PRICE, содержащую следующие поля:
- название товара;
- название магазина, в котором продается товар;
- стоимость товара в руб.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE;
- вывод на список товаров, в которые есть в наличии в указанном магазине;
- если такого магазина нет, выдать на дисплей соответствующее сообщение
Вариант 25
Описать структуру с именем COMP, содержащую следующие поля:
- название компьютера;
- рейтинговая частота процессора;
- количество ОЗУ.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа COMP;
- вывод на экран список компьютеров у которых мощность процессора выше среднего;
Вариант 25
Описать структуру с именем COMP, содержащую следующие поля:
- название компьютера;
- рейтинговая частота процессора;
- количество ОЗУ.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа COMP;
- вывод на экран список компьютеров у которых количество памяти больше 64Мб и меньше 1024Мб.
Вариант 26
Описать структуру с именем COMP, содержащую следующие поля:
- название компьютера;
- рейтинговая частота процессора;
- количество ОЗУ.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из восьми элементов типа COMP;
- вывод на экран список компьютеров у которых количество памяти больше 128Мб и частота процессора больше 1000Гц.
Контрольний приклад
В файле храниться информацию о студентах. Необходимо считать данные из файла и записать их в бинарный файл. Затем считать оттуда их оттуда и вывести на экран в форматированном виде а также записать их текстовой файл в таком же форматированном виде
Тескстовый файл f1.txt хранить следующую информацию
Сидоров
Максименко
Петров
Клименко
На экране и в текстовом файле f3.txt будет выведена следующая информация
Начало
Result:
Сидоров................................3
Максименко.............................5
Петров.................................2
Клименко...............................6
Конец
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
struct Tstud{
char FIO[90];
int data;
};
int main()
{
int i;
const int n=4;
cout<<"Начало"<<endl;
ifstream innn("f1.txt");//файл для чтения
Tstud PM[n];
char str[90];
//Чтение информации из файла
for(i=0;i<n;i++)
{
innn.getline(PM[i].FIO,90);
innn.getline(str,90);
PM[i].data=atoi(str);
}//конец чтения из файла
//запись в бинарный файл
ofstream binout("f2.txt",ios::binary); //поток для записи в бинарный файл
binout.write((char*)&PM[0],sizeof(Tstud)*n);
binout.close();
//конец записи в бинарный файл
Tstud PM2[n];
//чтение из бинарного файла
ifstream bincin("f2.txt",ios::binary); //поток для чтения из бинарного файла
for(i=0;i<n;i++)
{
bincin.read((char*)&PM2[i],sizeof(Tstud));
//bincin.read((char*)&PM2[0],sizeof(Tstud)*n);
}
bincin.close();
//конец чтения из бинарного файла
cout<<"Result: "<<endl;
for(i=0;i<n;i++)
{
cout<<resetiosflags(ios::right);
cout.setf(ios::left);
cout<<setw(20)<<setfill('.');//тоже самое что и cout.width(20); cout.fill('.');
cout<<PM2[i].FIO;
cout.width(20);//тоже самое что и cout<<setw(20);
cout.setf(ios::right);
cout<<PM2[i].data<<'\n';
}
ofstream out("f3.txt",ios::binary); //Запись текстового файла
for(i=0;i<n;i++)
{
out<<resetiosflags(ios::right);
out.setf(ios::left);
out<<setw(20)<<setfill('.');//тоже самое что и cout.width(20); cout.fill('.');
out<<PM2[i].FIO;
out.width(20);//тоже самое что и cout<<setw(20);
out.setf(ios::right);
out<<PM2[i].data<<'\n';
}
bincin.close();
cout<<endl;
cout<<"Конец"<<endl;
cin.get();
return 1;
}
3 Файлові потоки мови С
Мета роботи
3.2 Вказівки щодо організації самостійної роботи студентів
Поток является программной надстройкой над файлом, предоставляющей программисту дополнительный сервис. Схема работы с потоком такая же, как и с файлом: открыть поток, выполнить чтение и/или запись, закрыть поток.
Открывает поток вместе с ассоциированным файлом функция
FILE* fopen(const char *filename, const char *mode )
Функция получает имя filename файла, ассоциированного с потоком, и возвращает указатель на поток, который идентифицирует его в последующих операциях.
В строке режимов mode могут находиться следующие символы:
r — открыть только для чтения.
w — создать для записи. Существующий файл будет перекрыт новым файлом.
a — открыть для дозаписи, или создать для записи, если файла нет
+ — операции будут выполняться с уже существующим файлом.
t — текстовый режим (обработка символов CR-LF).
b — двоичный режим (никакой обработки).
При отсутствии в строке символов b или t, режим определяется глобальной переменной _fmode, определенной в заголовочном файле fcntl.h.
FILE — это управляющая структура для потока, объявленная в stdio.h. Она не предназначена для прямого использования.
Помимо совместного открытия потока и файла (fopen), можно открыть поток и ассоциировать его с уже открытым файлом (fdopen), открыть файл и ассоциировать его с уже открытым потоком (freopen).
Закрывает поток и выгружает буферы функция
int fclose ( FILE *stream )
Функция возвращает 0 при успехе и константу EOF при ошибке.
Функция int fcloseall()закрывает все открытые потоки, кроме стандартных: stdin, stdout, stdprn, stderr и stdaux.
Ввод и вывод символов
Чтение символа из потока выполняется функцией
int fgetc(FILE *stream)
Запись символа в поток выполняется функцией
int fputc(int c, FILE *stream)
Обе функции возвращают код символа, а при ошибке возвращают EOF.
Чтение символа из стандартного потока stdin выполняется функцией
Int fgetchar(void)
Запись символа в стандартный поток stdout выполняется функцией
Int fputchar(int c)
Пример. Скопировать файл xxx.bin в файл yyy.bin.
ß
FILE *in = fopen ("c:\\xxx.bin", "rt");
FILE *out = fopen ("c:\\yyy.bin", "wt");
if (!in) return;
while (!feof(in))
fputc(fgetc(in), out);
fcloseall();
Ввод и вывод строк
Чтение строки из потока выполняется функцией
char *fgets(char *s, int n, FILE *stream)
Первый параметр указывает на буфер, принимающий строку, второй – задает размер буфера. Функция возвращает указатель на буфер или 0 при ошибке.
Чтение прекращается, когда достигнут конец строки или прочитано n-1 символов из файла. Строка в буфере замыкается символами '\n' и нулевым. Указатель файла перемещается за символы CR-LF.
Запись строки в поток выполняется функцией
char *fputs(char *s, FILE *stream)
Функция возвращает указатель на последний записанный символ или EOF при ошибке. Терминальный символ строки не копируется.
Пример. Скопировать текстовый файл xxx.txt в файл yyy.txt по строкам.
ß
const int n = 100;
char buf [n];
FILE *in = fopen("c:\\xxx.txt","r");
FILE *out = fopen("c:\\yyy.txt","w");
if (!in) return;
while (!feof(in)) {
fgets(buf, n, in);
fputs(buf, out);
}
fcloseall();
Ввод и вывод записей
Чтение записей из потока выполняется функцией
size_t fread(void *ptr, size_t size, size_t n, FILE *stream)
ptr - указатель на буфер в памяти, принимающий записи
size - размер записи в байтах
n - количество читаемых записей
Функция возвращает количество прочитанных записей, которое может быть и нулевым.
Замечание. Тип size_t определен в файле stdio.h как unsigned int.
Вывод записей в поток выполняется функцией
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)
ptr - указатель на буфер в памяти, содержащий записи;
size - размер записи в байтах;
n - количество выводимых записей.
Функция возвращает количество выведенных записей, которое может быть и нулевым.