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

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

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

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

Текстовый файл можно сформировать и прочитать посимвольно, используя для этого методы put () и get () соответственно для записи символа в файл и чтения символа из файла.

1. #include<fstream>

2. #include<iostream>

3. usingnamespace std;

Int main()

5. { char FileName[20];

6. char Ch;

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

8. fstream F;

9. F.open(FileName,ios::out);

10. for (int i=32; i<91; i++) { Ch=i; F.put(Ch); };

11. F.close();

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

13. F.open(FileName, ios::in);

14. while (F.get(Ch)){ cout << Ch; }

15. F.close();

16. cout << endl;

17. return 0;

18. }

 

В строке 10 организован цикл, в котором с помощью метода put () осуществляется посимвольная запись в текстовый файл. В 14 строке представлен цикл, обеспечивающий посимвольное чтение с помощью метода get () из текстового файла и вывод на консоль.

В текстовый файл можно записать и можно из него прочитать данные, используя для этого методы соответственно write () и read (). Приведем пример соответствующей программы.

1. # include < fstream >

2. # include < iostream >

3. # include < stdlib. h >

4. usingnamespace std;

Int main()

6. { char FileName[20]; char X[15];

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

8. ofstream F(FileName, ios::out);

9. for (int i=0; i<3; i++)

10. { cout <<"Vvedite "<< i <<" stroku: "; cin >> X;

11. F.write(X,sizeof(X));

12. _itoa_s(i,X,4,10); F.write(X,sizeof(X));

13. _gcvt(1.0/(i+1),6, X); F.write(X,sizeof(X));

14. };

15. F.close();

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

17. ifstream P(FileName);

While (P.read(X,sizeof(X)))

19. { cout << X << endl; }

20. P.close();

21. return 0;

22. }

В программе формируется файл, в котором, как и в программах пункта 2 этой лекции, трижды записывается триада значений (символьная строка – целочисленное значение – вещественное). Операция записи в файл выполняется на основе использования метода write () (см. стр. 11-13), а считывание из файла реализовано на основе использования метода read () (см. стр. 18).

Отметим, что в строке 3 подключается заголовочный файл stdlib. h для использования в 12 строке функции преобразования _ itoa _ s (i, X,4,10); целочисленного значения в строковое и для использования в 13 строке функции преобразования _ gcvt (1.0/(i +1),6, X); вещественного значения в строковое.

Программой на внешнем устройстве в результате был сформирован файл со следующим содержимым:

 

 

 

37 Основы работы с двоичными файлами в языке С++.

Сохранять данные в файле в языке С++ можно не только в текстовом представлении, но и в двоичном формате. Текстовая форма означает, что все данные, включая числовые, сохраняются в виде текста, который можно легко просмотреть с помощью обычного текстового редактора.

Например, сохранение целочисленного значения 1234567890 в текстовом виде означает сохранение 10 символов-цифр, из которых состоит данное число. Если же сохранить это число в двоичном формате, то оно будет размещаться во внутреннем представлении, т.е. вместо символов сохраняется 32-битное представление числа типа int.

 

Для значения типа char двоичное представление совпадает с его текстовым — двоичным представлением (например, ASCII-код символа). Для чисел же двоичное представление кардинально отличается от их текстового представления.

 

У каждого формата хранения данных в файле имеются свои достоинства. Так, текстовые файлы, во-первых, легко читать и редактировать с помощью обычного текстового редактора, во-вторых, можно относительно легко переносить с одной системы на другую.

 

В двоичном формате вещественные числа сохраняются более точно, поскольку они сохраняются во внутреннем представлении. Обычно сохранение данных в двоичном формате происходит быстрее, поскольку при этом не выполняются соответствующие преобразования, и требуется меньше пространства для хранения (в зависимости от природы данных). Однако при переносе данных с одной систему на другую могут возникать проблемы, в случае если новая система использует другое внутреннее представление данных. При такой ситуации необходимо будет писать программу, которая будет обеспечивать требуемые преобразования данных.

 

Чтобы сохранить данные в двоичном файле можно воспользоваться методом write(). Этот метод копирует определенное число байтов из памяти в файл, причем он копирует любой тип данных байт в байт, не производя преобразования. Например, если ему передать адрес переменной типа int и указать скопировать 4 байта, то данный метод скопирует 4 байта, передав значение типа int и не производя его преобразования.

 

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

 

Рассмотрим пример программы, в которой создается двоичный файл. В этот файл записываются значения типа char, int, double, bool и float. Затем из файла читаются эти значения и выводятся на экран.

 

1. #include<fstream>

2. #include<iostream>

3. usingnamespace std;

Int main()

5. { char FileName[20];

6. char Ch='Y',Ch2; bool Bo=true,Bo2; int In=1234567890,In2;

7. double Do=123.45,Do2; float Fl=98.75,Fl2;

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

9. ofstream F(FileName, ios::binary);

10. F.write((char*)&Ch,sizeof(Ch));

11. F.write((char*)&In,sizeof(In));

12. F.write((char*)&Do,sizeof(Do));

13. F.write((char*)&Bo,sizeof(Bo));

14. F.write((char*)&Fl,sizeof(Fl));

15. F.close();

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

17. ifstream P(FileName,ios::binary);

18. P.read((char*)&Ch2,sizeof(Ch2)); cout << Ch2 << endl;

19. P.read((char*)&In2,sizeof(In2)); cout << In2 << endl;

20. P.read((char*)&Do2,sizeof(Do2)); cout << Do2 << endl;

21. P.read((char*)&Bo2,sizeof(Bo2)); cout << Bo2 << endl;

22. P.read((char*)&Fl2,sizeof(Fl2)); cout << Fl2 << endl;

23. P.close();

24. return 0;

25. }

 

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

 

В строке 5 определяется переменная FileName для размещения имени двоичного файла на внешнем устройстве.

 

В строках 6-7 определяются 10 переменных (5 из которых инициализируются начальными значениями) пяти различных типов.

 

В строке 8 выдается запрос на ввод имени файла, и осуществляется ввод имени с клавиатуры.

 

В строке 9 создается объект Fкласса ofstream, который ассоциируется с двоичным файлом на внешнем устройстве. Соответствующее имя файла на внешнем устройстве берется из переменной FileName.

 

В строках 10–14 в двоичный файл записываются пять разнотипных значений. В 15 строке файл закрывается.

В строке 17 создается объект Pкласса ifstream, который ассоциируется с двоичным файлом на внешнем устройстве, имя которого задается переменнойFileName.

В строках с 18 по 22 включительно с использованием метода read() считывается 5 соответствующих значений из файла. В строке 23 закрывается файл. Отметим, что при достижении конца программы автоматически закрываются все открытые в программе файле.

!!! Если в рассмотренной выше программе заменить строки:

9. ofstream F(FileName); настроку fstream F(FileName);

17. ifstream P(FileName); настроку fstream P(FileName, ios::in | ios::binary);,топрограммабудетработать.

В предыдущей программе были использованы два потока F и P. Приведем пример программы, которая использует только один поток. В процессе ее выполнения создается двоичный файл, содержащий 12 целочисленных значений сформированных случайным образом.

1. #include<fstream>

2. #include<iostream>

3. #include<stdlib.h>

4. #include<time.h>

5. usingnamespace std;

Int main()

7. { char FileName[20];

8. int S, kol_vo=12;

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

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

11. srand((unsigned)time(NULL));

12. for(int i=0; i<kol_vo; i++)

13. {S=rand(); F.write((char*)&S,sizeof(S));};

14. F.close();

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

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

17. while (F.read((char*)&S,sizeof(S))) cout << S << endl;

18. F.close();

19. return 0;

20. }

В строке 8 создается поток F типа fstream, который с помощью метода open (FileName, ios:: out | ios:: binary) поток F связывается с двоичным файлом на внешнем устройстве и устанавливается режим записи данных в этот файл. В 12-13 строках в цикле с помощью ГСЗ генерируются 12 целых чисел и записываются в двоичный файл, а в 14 строке он закрывается.

В 16 строке поток F связывается с двоичным файлом на внешнем устройстве и устанавливается режим чтения данных из этого файла. В 17 строке организован цикл, в котором последовательно происходит считывание чисел из файла и вывод их на консоль. В 18 строке файл закрывается и далее программа завершается.

 


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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

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

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



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

0.039 с.