//
Впрочем, если это не сделано деструктор объекта закроет
//
открытый файл.
При открытии файла можно указать режим, в котором он будет открыт.
Режим задается следующими значениями перечисления:
•
fstream::in (input
) файл для чтения. Для ifstream он включен по
умолчанию
•
fstream::out (output) файл для записи. Для ofstream он включен по
умолчанию
•
fstream::binary (binary
) бинарный файл (данные в
файле не
интерпретируются как символы, в частности 0x0D 0x0A не означат перевод
строки). По умолчанию включен текстовый режим.
•
fstream::ate (at end
) текущая позиция записи установлена в конец файла.
запись осуществляется в нее, но позицию можно поменять
•
fstream::app (append
) запись осуществляется
только в конец файла
независимо от текущей позиции записи
•
fstream::trunc (truncate
) очистка содержимого файла при открытии.
#include
// открытие бинарного файла для чтения
fstream file( "input-file.txt", fstream::binary | fstream::in);
После открытия файла можно проводить операцию чтения его
содержимого аналонично тому, как это происходит при чтении клавиатурного
ввода. Код для чтения тектсового файла со значениями смешанного типа -
целые, вещественные, строки:
1.0 2.0 3.0 11 "str1"
1.1 2.1 3.1 22 str2
1.2 2.2 3.2 33 "str3"
...может выглядеть следующим образом:
#include
#include
// в коде используется тип 'string'
#include
> // требуется для форматирования отладочного вывода
ifstream file("dat/example-005-in.txt
"); // файл лежит в подкаталоге 'dat/'
// структура данных, соответствующая записи в файле
struct Record
{
double p,q,r;
int i;
string s;
} rec;
// проверка успешного открытия файла
if(file)
44
{
// чтение файла до конца записей
while( file >> rec.p >> rec.q >> rec.r >> rec.i >> rec.s )
{
// отладочный вывод считанных значений на консоль
cout << setprecision(2) << fixed;
cout << "p=" << rec.p;
cout << " q=" << rec.q;
cout << " r=" << rec.r;
cout << " i=" << rec.i;
cout << " s=" << rec.s << endl;
}
}
Внимание: строки в файле должны соответствовать предполагаемому
формату записей. В данном случае:
три вещественных числа, одно целое и
строка.
Чтение текстового файла может осуществляться функцией 'getline()' построчно
с последующим разбором строки на отдельные элементы. Образец файла:
1.0 01/09/2014 11 "str1"
1.1 02/09/2014 22 "str2"
1.2 03/09/2014 33 "str3"
struct Record
{
float p;
int day,month,year;
int i;
char c[256]; // sscanf
, импользуемый в этом примере не
//
поддерживает тип 'string'
} rec;
string str;
while( getline(file,str) )
{
cout << "line content " << str << endl;
// Существуют разные способы. Например с вызовом 'sscanf()'
sscanf(str.c_str(), "%g %2d/%2d/%4d %d %s",
&rec.p,&rec.day,&rec.month,&rec.year,&rec.i, rec.c);
cout << "parsed=" << rec.p<< " "<
" "<
}
В контесте разбора строки на элементы стоит обратить внимание на
регулярные выражения, также входящие в состав стандартной библиотеки,
правда на момент написания этого документа не везде и не полностью еще
45
реализованные. Регулярные выражения выходят за рамки этого документа.
Информацию без труда вы сможете найти в Интернет.
Для различных преобразований
существуют группы функций,
определенных в: std::to_string - конвертирование числовых типов в строки
(string str = to_string(3.14);) std::stoi, std::stol, std::stoll -
конвертирование строки
в целое соотвествующей имени функции длины (int i = stoi("3");) std::stof,
std::stod, std::stold -
конвертирование строки в вещественное число
соотвествующей имени функции длины (double d = stod("3.14");)
Do'stlaringiz bilan baham: