Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_kollokvium_l_20_21 (1).docx
Скачиваний:
3
Добавлен:
24.08.2019
Размер:
41.63 Кб
Скачать
  1. Как избежать переполнения строки-приемника при вводе символьных строк? (л.20) стр. 15-16

Манипулятор setw(), как и форматирующая функция width(), может помочь избежать переполнения строки-приемника при вводе символьных строк.

const int SIZE = 50;

char array[SIZE];

Cin » setw(sizeof(array)); //или cin.width(sizeof(array));

cin » array; //ограничивает число вводимых символов

//и позволяет избежать выхода

//за границу массива

  1. Определить собственный манипулятор для форматирования вывода переменных вещественного типа, включающий не менее 5 операций форматирования? (л.20)стр. 29

Можно определить собственный манипулятор (например, tab). Для этого надо просто написать функцию, которая получает и возвращает ссылку на поток:

ostream& tab( ostream& os ) {

return os << '\t'<< '\t';

}

cout << ‘a’ << tab << ‘b’ << endl; //a b

Чтобы форматированный вывод было проще записывать, можно объединить все используемые в нем манипуляторы в одной функции.

Для вывода:

cout << setfill(‘-‘) << setw(10) << hex << internal << val << endl;

напишем функцию setfix:

ostream& setfix( ostream& os )

{ os.width(10); os.fill(‘^‘);

os.setf(ios::internal, ios::adjustfield);

os.setf(ios::hex, ios::basefield);

return os;

}

Тогда вывод в cout той же переменной val (имеет значение100) в том же формате записывается значительно короче:

cout << setfix << val << endl;

  1. Как сделать текстовый файл на примере последовательности случайных чисел (в редакторе и в программе)? (л.20, пример 2) стр. 32-34, 51

#include <fstream>

#include <time.h>

int main()

{srand((unsigned) time(NULL));

ofstream outfile ("TEST.TXT"); //выходной поток

if(!outfile) {cout<< "error1"<< endl; _getch();

return 1;

}

for (int i=1; i<=20; i++) //вывод в файл случайных чисел

outfile << rand() %6 << '\n';

outfile.close();

ifstream infile ("TEST.TXT"); //входной поток

if(!infile) {cout<< "error2"<< endl; _getch();

return 2;

}

char str[5] = {0};

while (true )

{

infile.getline(str,5);

if (infile.eof() ) break;

cout << str <<'\n';

}

_getch();

return 0;

}

  1. Как сделать бинарный файл на примере последовательности случайных чисел (в редакторе и в программе)? (л.20, пример 9) стр. 35-36, 52

двоичные (бинарные) файлы не являются форматируемыми (не разбиваются на строки, никаких преобразований при обмене не выполняется); пример двоичного файла – исполняемый файл с расширением exe;

элементы двоичных файлов хранятся во внутреннем представлении и поэтому должны создаваться программно;

при операции записи в двоичный файл попадает столько байтов, сколько записываемый объект занимает в памяти (для типа int – sizeof (int) байтов);

двоичные файлы могут содержать элементы разных типов, но для большей надежности их следует формировать из элементов только определенного типа;

в случае если двоичный файл представляет собой последовательность однотипных элементов, с ним можно работать и как с файлом последовательного доступа, и как с файлом прямого доступа, в котором возможен непосредственный доступ к любому из его элементов;

двоичный файл предпочтительнее текстового как в отношении надежности, так и в отношении скорости выполнения операций (даже для последовательной обработки однотипных данных);

благодаря возможности прямого доступа к своим элементам двоичные файлы представляются очень привлекательными при чередовании операций чтения и записи данных.

Получить эти последовательности можно поэлементным выводом значений (в цикле) либо выводом одним оператором (как массива) с помощью функции-метода write;

struct t { unsigned char a;char b; int c;} ft;

struct s { int ar[3];} fs;

#include <fstream>

#include <ctime>

int main()

{srand((unsigned) time(NULL));

ofstream outfile ("TEST.bin", ios::binary);

if(!outfile) {cout<< "error1"<< endl;

_getch();

return 1;

}

int a;

for (int i=1; i<=20; i++)

{a=rand()%6;

outfile.write (reinterpret_cast<char *>(&a), sizeof(int));

}

outfile.close();

ifstream infile ("TEST.bin", ios::binary);

if(!infile) {cout<< "error2"<< endl;

_getch();

return 2;

}

while (infile.read (reinterpret_cast<char *>(&a), sizeof(int)))

cout << a << ' ';

cout << endl;

_getch();

return 0;

}