- •Выполнить для структурной переменой перегрузку операторов ввода/ вывода в стандартный поток внешними функциями. (л.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)
Как записать в бинарный файл и прочитать из него массив, 3 структурные переменные, массив из 3 структур? (л.20, пример 10) стр. 53
#include <fstream>
struct person //определение структурного типа
{char name[80]; int age;};
int main()
{person pers; //определение структурной переменной
fstream ffile("TEST.dat", ios::binary | ios::in | ios::out);
if(!ffile) {cout<< "error1"<< endl; _getch(); return 1; }
ffile.seekg(0, ios::end); //установить указатель файла в конец файла
int endpos = ffile.tellg(); //значение текущей позиции указателя файла
int n = endpos/sizeof(pers); // количество персон в файле
cout << "N person =" << n << endl;
cout << " input n : " << endl ; cin >> n ;
int pos = (n-1) * sizeof(pers) ; //вычисление байта с информацией о персоне
ffile.seekg(pos); //установить указатель файла на нужный байт
ffile.read (reinterpret_cast<char *>(&pers), sizeof(pers));
cout << pers.name << ' ' <<pers.age << endl;
cout << " input name, age : " << endl ;
cin >> pers.name >> pers.age; //ввод в структурную переменную новых значений
ffile.seekp(pos); //ffile.seekp(-1*sizeof(pers), ios::cur); //замена записи
ffile.write (reinterpret_cast<char *>(&pers), sizeof(pers));
ffile.seekg(pos); //ffile.seekg(-1*sizeof(pers),ios::cur); //вывод новой записи
ffile.read (reinterpret_cast<char *>(&pers), sizeof(pers));
cout << pers.name << ' ' <<pers.age << endl;
_getch();
return 0; }
массив из структур
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
# define kil 5
struct cars
{
std::string marka;
std::string year;
std::string color;
std::string number;
}; //car[kil],*pcar=&car[0],*pc=&car[kil];
void WriteFile(FILE *pfile, cars *p, int n);
FILE *pfile;
car s;
int main()
{ cars a[kil];
WriteFile(pfile,a,kil);
return 0;
}
void WriteFile(FILE *pfile, cars *p, int n)
{
pfile= fopen("d:\\infocar0.txt","w");
fscanf(pfile,"%s",car[1].color);
fclose(pfile);
{fstream fioun ("dbase.bin", ios::in | ios::out | ios::binary);
if (!fioun) {cout << "Error" << endl; _getch(); return 1;}
int i = file_read(fioun); //вызов функции чтения файла и вывода на экран
Почему при неправильной организации чтения из файла последняя запись может повторяться 2 раза? (л.20)
Как обеспечить возможность повторного чтения только что прочитанного файла? (л.20)
Привести пример использования функций peek(), ignore(), putback().(л.20) ignore – 12,47 peek – 46,47 putback - 47
1)ignore
int main()
{ int i;
while (true) //бесконечный цикл
{ cout << "input int" << endl;
cin >> i;
if (cin.good()) //если нет ошибок при вводе
{ //……
break; //выход из бесконечного цикла
}
cin.clear(); //если ошибка при вводе, очищаем флаги
cout << "error" << endl;
cin.ignore(10, '\n'); //функция извлекает оставшиеся символы из потока, //ее параметры: //10- количество удаляемых символов (1–по умолчанию), // ’\n’ – символ-ограничитель – тоже удаляется из потока, // по умолчанию символ-ограничитель – конец файла
}
cout << i << endl; _getch(); return 0; }
while ( cin.get( ch )) //чтение символа из потока
{ switch (ch) {
case '/': // это комментарий? смотрим с помощью peek()
// если да, пропустить остаток строки
next = cin.peek(); //просмотр следующего символа
if ( next == '/' )
cin.ignore( lineSize, '\n' );
break;
2) peek
//пример 1
char c[10], c2;
cout << "Type 'abcde': “ << endl; //abcde попадает в буфер ввода;
c2 = cin.peek( ); //определяется первый вводимый символ, он остается в буфере
cin.getline( c, 9 ); //getline() вводит в символьный массив с строку abcde
cout << c2 << " " << c << endl; //вывод символа a и строки abcde
while ( cin.get( ch )) //чтение символа из потока
{ switch (ch) {
case '/': // это комментарий? смотрим с помощью peek()
// если да, пропустить остаток строки
next = cin.peek(); //просмотр следующего символа
if ( next == '/' )
cin.ignore( lineSize, '\n' );
break;
3) putback
next = cin.peek(); //просмотр следующего символа
if ( next == '>' ) {
lookahead = cin.get(); //чтение и сохранение этого символа
next = cin.peek(); //просмотр следующего символа
if ( next != '=' )
cin.putback( lookahead ); //возврат символа в поток
}
break;
}