Обработка двоичных файлов с компонентами типа struct . — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Обработка двоичных файлов с компонентами типа struct .

2022-10-10 23
Обработка двоичных файлов с компонентами типа struct . 0.00 из 5.00 0 оценок
Заказать работу

Пользователь имеет возможность формировать и обрабатывать двоичные файлы, компоненты которого относятся к агрегатному типу struct. Рассмотрим пример соответствующей программы.

1. # include < fstream >

2. # include < iostream >

3. usingnamespace std;

Struct avto

5. { public:

6. avto() { cena=98765; rashod=7.5; }; // конструктор

7. char marka[12];

8. int cena;

9. double rashod;

10. };

Int main()

12. { char FileName[20]; avto S;

13. cout <<"Vvedite imya FILE: "; cin >> FileName;

14. fstream F(FileName, ios::out | ios::binary);

15. for(int i=0; i<2; i++)

16. { cout << endl;

17. cout <<"Vvedite marku avto: "; cin >> S.marka;

18. cout <<"Vvedite cenu avto: "; cin >> S.cena;

19. cout <<"Vvedite rashod avto: "; cin >> S.rashod;

20. F.write((char*)&S,sizeof(S));

21. };

22. F.close();

23. cout << endl <<"FILE "<< FileName <<": \n";

24. F.open(FileName,ios::in | ios::binary);

25. while (F.read((char*)&S,sizeof(S))) cout << S.marka <<

26.       " "<< S.cena <<" "<< S.rashod << endl;

27. F.close();

28. cout << endl <<"SIZE OBJECT-CLASS avto = "<<

29.        sizeof (avto) << endl;

30. return 0;

31. }

 

В строке 1 подключается библиотека < fstream >, внутри которой определены три класса ifstream, ofstream и fstream для работы с файлами.

 

В строках 4-10 описывается агрегатный тип structavto, внутри которого определены явный конструктор и 3 поля.

Struct avto

5. { public:

6. avto() { cena=98765; rashod=7.5; }; // конструктор

7. char marka[12];

8. int cena;

9. double rashod;

10. };

 

В строке 12 определяются переменная FileName для размещения имени двоичного файла на внешнем устройстве и переменная S структурного типа avto. В строке 13 обеспечивается ввод имени двоичного файла на внешнем устройстве.

 

В строке 14 создается поток Fкласса fstream, который ассоциируется с двоичным файлом на внешнем устройстве (имя файла на внешнем устройстве берется из переменной FileName), и настраивается для выполнения вывода в двоичный файл.

 

В строках 15-21 организован цикл для ввода значений 3 полей структуры S и для записи 2 структурных значений в двоичный файл.

15. for(int i=0; i<2; i++)

16. { cout << endl;

17. cout <<"Vvedite marku avto: "; cin >> S.marka;

18. cout <<"Vvedite cenu avto: "; cin >> S.cena;

19. cout <<"Vvedite rashod avto: "; cin >> S.rashod;

20. F.write((char*)&S,sizeof(S));

21. };

 

В строке 22 закрывается файл, а в 24 – двоичный файл открывается для чтения.

 

В строках 25–26 организован цикл для чтения всех записей (в данном варианте программы двух записей) двоичного файл и вывода соответствующих значений на экран.

25. while (F.read((char*)&S,sizeof(S))) cout << S.marka <<

26.       " "<< S.cena <<" "<< S.rashod << endl;

 

В строках 28-29 выводится размер структурного значения.

 

 

Прямой доступ в двоичных файлах.

Программист имеет возможность применять внутри двоичного файла прямой доступ, позиционируя внутренний файловый курсор либо относительно начала файла (beg), либо относительно текущей записи (cur).

1. #include<fstream>

2. #include<iostream>

3. usingnamespace std;

Class avto

5. { public:

6. char marka[12];

7. int cena;

8. double rashod;

9. };

Int main()

11. {

12. char FileName[20]; avto S;

13. cout <<"Vvedite imya FILE: "; cin >> FileName;

14. fstream F;

15. F.open(FileName,ios::out | ios::binary);

16. for(int i=0; i<4; i++)

17. { cout << endl;

18. cout <<"Vvedite marku avto: "; cin >> S.marka;

19. cout <<"Vvedite cenu avto: "; cin >> S.cena;

20. cout <<"Vvedite rashod avto: "; cin >> S.rashod;

21. F.write((char*)&S,sizeof(S)); };

22. F.close();

23. cout << endl <<"FILE "<< FileName <<": \n";

24. F.open(FileName,ios::in | ios::binary);

25. F.seekg(sizeof(S),ios_base::beg);

26. F.read((char*)&S,sizeof(S));

27. cout << S.marka <<" "<< S.cena <<" "<<

28.         S.rashod << endl;

29. F.seekg(sizeof(S),ios_base::cur);

30. F.read((char*)&S,sizeof(S));

31. cout << S.marka <<" "<< S.cena <<" "<<

32.         S.rashod << endl;

33. F.seekg(0,ios_base::beg);

34. F.read((char*)&S,sizeof(S));

35. cout << S.marka <<" "<< S.cena <<" "<<

36.          S.rashod << endl;

37. F.close();

38. cout << endl <<"SIZE OBJECT-CLASS avto = "<<

39.        sizeof(avto) << endl;

40. return 0;

41. }

 

В строке 1 подключается библиотека < fstream >, внутри которой определены три класса ifstream, ofstream и fstream для работы с файлами.

 

В строках 4-9 описывается class avto, внутри которого определены 3 поля.

Class avto

5. { public:

6. char marka[12];

7. int cena;

8. double rashod;

9. };

 

В строке 12 определяются переменная FileName для размещения имени двоичного файла на внешнем устройстве и объект S класса avto. В строке 13 обеспечивается ввод имени двоичного файла на внешнем устройстве.

 

В строке 14 создается поток Fкласса fstream, который в 15 строке ассоциируется с двоичным файлом на внешнем устройстве (имя файла на внешнем устройстве берется из переменной FileName), и двоичный файл открывается для вывода.

 

В строках 16-22 организован цикл для ввода значений 3 полей объекта S и для записи значений 4 экземпляров класса (объектов) в двоичный файл.

16. for(int i=0; i<4; i++)

17. { cout << endl;

18. cout <<"Vvedite marku avto: "; cin >> S.marka;

19. cout <<"Vvedite cenu avto: "; cin >> S.cena;

20. cout <<"Vvedite rashod avto: "; cin >> S.rashod;

21. F.write((char*)&S,sizeof(S)); };

22. F. close ();

 

В строке 23 закрывается файл, а в 24 – двоичный файл открывается для чтения.

 

В строке 25 реализован прямой доступ ко второму экземпляру класса в двоичном файле, поскольку ios _ base:: beg означает, что отсчет начинается с начала файла, а смещение задается выражением sizeof (S). В 26 строке считывается значение второй записи файла, и курсор внутри файла позиционируется в начале третьей записи. В 27-28 строках соответствующие значения полей второй записи выводятся на экран.

25. F.seekg(sizeof(S), ios_base::beg);

26. F.read((char*)&S,sizeof(S));

27. cout << S.marka <<" "<< S.cena <<" "<<

28.         S.rashod << endl;

 

В строке 29 реализован прямой доступ к четвертому экземпляру класса в двоичном файле, поскольку ios _ base:: cur означает, что отсчет начинается с текущей позиции курсора в файле (в данном случае с третьей), а смещение задается выражением sizeof (S). В 30 строке считывается значение четвертой записи файла, а в 31-32 строках соответствующие значения полей выводятся на экран.

29. F.seekg(sizeof(S),ios_base::cur);

30. F.read((char*)&S,sizeof(S));

31. cout << S.marka <<" "<< S.cena <<" "<<

32.         S.rashod << endl;

 

В строке 33 реализован прямой доступ к первому экземпляру класса в двоичном файле, поскольку ios _ base:: beg означает, что отсчет начинается с начала файла, а смещение равно 0.В 34 строке считывается значение самой первой записи файла, а в 35-36 строках соответствующие значения полей выводятся на экран.

 

33. F.seekg(0,ios_base::beg);

34. F.read((char*)&S,sizeof(S));

35. cout << S.marka <<" "<< S.cena <<" "<<

36.          S.rashod << endl;

 

В строках 38-39 выводится размер объекта класса avto.

 

 


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.021 с.