Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_kollokvium_l_20_21 (1).docx
Скачиваний:
3
Добавлен:
24.08.2019
Размер:
41.63 Кб
Скачать
  1. Как записать в бинарный файл и прочитать из него массив, 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); //вызов функции чтения файла и вывода на экран

  1. Почему при неправильной организации чтения из файла последняя запись может повторяться 2 раза? (л.20)

  1. Как обеспечить возможность повторного чтения только что прочитанного файла? (л.20)

  1. Привести пример использования функций 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;

}