#include
#include
#include
using namespace std;
int main()
6 : {
600 ЗАНЯТИЕ 27. Применение потоков для ввода и вывода
ifstream myFile;
myFile.open("HelloFile.txt", ios_base::in);
if (myFile.is_open())
cout « "File open successful. It contains: " « endl;
string fileContents;
14
while (myFile.good())
getline (myFile, fileContents);
cout « fileContents « endl;
20
21 cout « "Finished reading file, will close now" « endl;
myFile.close();
24
|
else
|
"open() failed: check if file is in right folder"
|
25
|
cout «
|
26
|
«
|
endl;
|
return 0;
|
|
27
|
|
28:
|
}
|
|
Результат
File open successful. It contains:
My first text file!
Hello file!
Finished reading file, will close now
Чтобы код листинга 27.9 прочитал текстовый файл HelloFile.txt, создан ный в листинге 27.8, его следует либо переместить в рабочий каталог этого проекта, либо объединить этот код с предыдущим.
Анализ
Как обычно, вызов метода i s o p e n () в строке 8 проверяет успех вызова метода op en (). Обратите внимание на применение оператора извлечения » при чтении содер жимого файла непосредственно в строку, которая затем отображается при помощи объ екта c o u t в строке 18. В этом примере функция g e t l i n e () используется для чтения из файлового потока тем же способом, что и в листинге 27.7 при чтении ввода пользователя, по одной строке за раз.
Запись и чтение из двоичного файла
Фактически процесс записи в двоичный файл не слишком отличается от процесса, ко торый вам уже известен на настоящий момент. При открытии файла следует использовать флаг io s b a s e : : b in a r y как маску. Обычно используются методы o f s tr e a m : : w r i t e () и i f s t r e a m : : r e a d (), как показано в листинге 27.10.
Использование объекта std::fstream для работы с файлом
|
601
|
ЛИСТИНГ 27.10. Запись структуры в двоичный файл и ее восстановление из того же файла
#include
#include
2 : #include
#include
using namespace std;
5: /
struct Human
{
8 : Human () {};
Human(const char* inName, int inAge, \ const char* inDOB) : Age(inAge)
1 0 :
|
{
|
inName);
|
1 1 :
|
strcpy(Name,
|
1 2:
|
strcpy(DOB,
|
inDOB);
|
}
char N^me[30];
int Age;
char DOB[20];
};
19:
int main()
21: {
2 2 : Human Input("Siddhartha Rao", 101, "May 1910");
23:
ofstream fsOut ("MyBinary.bin", \
ios_base::out I ios_base::binary);
25:
if (fsOut.is_open())
28: cout « "Writing one object of Human to a binary file"
endl;
fsOut.write(reinterpret_cast(&Input), \ sizeof(Input));
fsOut.close();
}
32:
ifstream fsln ("MyBinary.bin", ios_base::in | ios_base::binary);
if(fsln.is_open())
{
Human somePerson;
fsln.read((char*)&somePerson, sizeof(somePerson));
39:
cout « "Reading information from binary file: " « endl;
cout « "Name = " « somePerson.Name « endl;
cout « "Age = " « somePerson.Age « endl;
cout « "Date of Birth = " « somePerson.DOB « endl;
}
45:
return 0;
}
602 ЗАНЯТИЕ 27. Применение потоков для ввода и вывода
Результат
Writing one object of Human to a binary file
Reading information from binary file:
Name = Siddhartha Rao
Age = 101
Date of Birth = May 1910
Анализ
строках 22-31 создается экземпляр структуры Human, содержащей атрибуты Name, Age и DOB. Она сохраняется на диске в двоичном файле M y B in a ry .b in с использованием объекта класса o f s tr e a m . Затем, в строках 33 -44, эта информация читается с исполь зованием другого потокового объекта класса i f s tre a m . Информация для вывода таких атрибутов, как Name и других, читается из двоичного файла. Этот пример демонстрирует также применение объектов i f s tr e a m и o f s tr e a m для чтения и записи файлов с исполь
зованием методов i f s t r e a m : :r e a d ( ) и o f s tr e a m : : w r i t e () соответственно. Обратите
внимание на применение оператора r e i n t e r p r e t c a s t в строке 29, фактически он вы
нуждает компилятор интерпретировать структуру как c h a r* . В строке 38 применяется приведение в стиле С.
ПРИМЕЧАНИЕ
|
Если бы не цели демонстрации, я записал бы структуру Human со всеми ее
|
|
|
атрибутами в файл XML. Формат XML обеспечивает гибкость и масштабируе
|
|
мость при хранении информации.
|
|
Если после сохранения такой структуры, как Human, в данной версии придется
|
|
добавить в нее новые атрибуты (например, NumChildren), то вам придется
|
|
позаботиться о функциональных возможностях метода ifstream::read О,
|
|
чтобы правильно читать двоичные данные прежних версий.
|
Использование объекта s td :: stringstream для преобразования строк
Предположим, есть строка, содержащая строковое значение "4 5 ". Как преобразовать это строковое значение в целое число со значением 45? И наоборот? Одной из весьма по лезных утилит, предоставляемых языком C++, является класс s t r i n g s t r e a m , обеспечи вающий выполнение множества преобразований.
СОВЕТ
|
Чтобы использовать класс std::stringstream, включите его заголовок:
|
|
|
#include
|
|
Некоторые из основных
|
операций класса s t r i n g s t r e a m дем онстрирует ли
|
стинг 27.11.
|
|
|
Использование объекта std::stringstream для преобразования строк
|
603
|
ЛИСТИНГ 27.11. Преобразование целочисленного значения в строковое,
наоборот, с использованием класса std: :stringstream_____________________
#include
#include
#include
using namespace std;
4:
int main()
6 : {
cout « "Enter an integer: ";
int Input = 0;
cin » Input;
1 0 :
stringstream converterStream;
converterStream « Input;
string strlnput;
converterStream » strlnput;
cout « "Integer Input = " « Input « endl;
17: cout « "String gained from integer, strlnput = " « strlnput
endl;
18:
stringstream anotherStream;
anotherStream « strlnput;
int Copy = 0;
anotherStream » Copy;
23:
cout « "Integer gained from string, Copy = " « Copy « endl;
return 0;
}
Результат
Enter an integer: 45
Integer Input = 45
String gained from integer, strlnput = 45
Integer gained from string, Copy = 45
Анализ
Пользователя просят ввести целочисленное значение. Сначала это целое число встав ляется в объект класса s t r i n g s t r e a m (строка 12) при помощи оператора « . Затем, в строке 14, оператор извлечения » используется для преобразования этого целого числа в строку. Потом эта строка используется как отправная точка для получения целочисленного значения переменной Сору, представляющего числовое значение строки в переменной s t r l n p u t .
ЗАНЯТИЕ 27. Применение потоков для ввода и вывода
РЕКОМЕНДУЕТСЯ
Используйте класс ifstream тогда, когда на мереваетесь только читать из файла
Используйте класс of stream тогда, когда на мереваетесь только писать в файл
Помните о проверке успешности открытия фай лового потока при помощи метода is_open (}. Используйте ее прежде, чем вставить или из влечь данные из файлового потока
Do'stlaringiz bilan baham: |