- •Выполнить для структурной переменой перегрузку операторов ввода/ вывода в стандартный поток внешними функциями. (л.20) стр.14
- •Как проверить состояние стандартного потока ввода? (л.20) стр. 15-16
- •Как избежать переполнения строки-приемника при вводе символьных строк? (л.20) стр. 15-16
- •Определить собственный манипулятор для форматирования вывода переменных вещественного типа, включающий не менее 5 операций форматирования? (л.20)стр. 29
- •Как сделать текстовый файл на примере последовательности случайных чисел (в редакторе и в программе)? (л.20, пример 2) стр. 32-34, 51
- •Как сделать бинарный файл на примере последовательности случайных чисел (в редакторе и в программе)? (л.20, пример 9) стр. 35-36, 52
- •Как записать в бинарный файл и прочитать из него массив, 3 структурные переменные, массив из 3 структур? (л.20, пример 10) стр. 53
- •Почему при неправильной организации чтения из файла последняя запись может повторяться 2 раза? (л.20)
- •Как обеспечить возможность повторного чтения только что прочитанного файла? (л.20)
- •Привести пример использования функций peek(), ignore(), putback().(л.20) ignore – 12,47 peek – 46,47 putback - 47
- •Как передать имя файла в качестве параметра функции main()? (л.20, примеры 5, 12)
- •Как сохранить при обработке файла невидимые символы и отредактировать их? (л.20, пример 6)
- •Как передать файл в функцию? (л.20, пример 7) примеры стр.2-3
- •Как сделать массив файлов и записать туда что-то? (л.20, пример 8) примеры стр.17
- •Как определить количество записей в бинарном файле и выполнить их корректировку? (л.20, пример 14)
Как избежать переполнения строки-приемника при вводе символьных строк? (л.20) стр. 15-16
Манипулятор setw(), как и форматирующая функция width(), может помочь избежать переполнения строки-приемника при вводе символьных строк.
const int SIZE = 50;
char array[SIZE];
Cin » setw(sizeof(array)); //или cin.width(sizeof(array));
cin » array; //ограничивает число вводимых символов
//и позволяет избежать выхода
//за границу массива
Определить собственный манипулятор для форматирования вывода переменных вещественного типа, включающий не менее 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;
Как сделать текстовый файл на примере последовательности случайных чисел (в редакторе и в программе)? (л.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;
}
Как сделать бинарный файл на примере последовательности случайных чисел (в редакторе и в программе)? (л.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;
}