Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 27

Рассмотрим следующий код.

Пример 1

int i = 1, j = 25, i1, j1;

double a = 25e6, a1;

string s("Сидоров"), s1;

ofstreamoutfile("test.txt");// создание файла как выходного потока

outfile << i << ‘ ‘ << j << ‘ ‘ << a << ‘ ‘ << s << endl;

outfile.close();// закрытие файла

ifstreaminfile("test.txt");// открытие файла как входного потока

infile >> i1 >> j1 >> a1 >> s1;

infile.close();// закрытие файла

Результат

1 25 2.5e+007 Сидоров.

В этом коде создается файл "test.txt", и в него записываются в текстовом виде два целых числа  i и  j,  действительное число aи стро-ка s, содержащая одно слово, после чего манипулятором потока endlосуществляется перевод строки. Причем запись всех этих данных выполняется одним оператором, содержащим сцепленные операции «поместить в поток».

После того как файл закроется, в нем будет записан текст "1 25 2.5e+07 Сидоров". Дальнейшие операторы создают входной поток, связанный с этим файлом и одним оператором, содержащим сцепленные операции «взять из потока», который читает все эти данные.

Продолжим рассмотрение операции <<. Последовательное применение операций «поместить в поток» (сцепленных или задаваемых самостоятельными операторами) приводит к занесению текстов в одну строку, как в рассмотренном выше примере. Если требуется перейти на новую строку, то можно или ввести в текст символ конца строки '\n', или применить манипулятор потока endl(сокращение от end line – конец строки). Например, оператор

outfile << "2 * 2 :\n" << (2 * 2) <<endl;

даст следующий результат: первая строка будет содержать текст "2 * 2 :", вторая – "4", а курсор файла будет переведен на третью строку.

В предыдущих примерах выводились константы и константные выражения. При выводе переменных все работает точно так же. Например, операторы

int i = 25, j = 2;

outfile << i << " * " << j << " = " << (i * j) << endl;

выводят в файл о текст: "25 * 2 = 50".

Помимо этой операции выводить данные в поток можно еще двумя способами: методом  putи методом  write.  Метод  putвыводит в поток один символ. Например, оператор

outfile.put('Я');

выведет в поток символ "Я".

Метод  write выводит в файл из символьного массива, на который указывает его первый параметр, число символов, указанных вторым параметром. Например, оператор

outfile.write(s,5);

записывает в поток outfile5 символов из массива s. Причем эти символы никак не обрабатываются, а просто выводятся в качестве сырых байтов данных. Среди этих символов, например, может встретиться в любом месте нулевой символ, но он не будет рассматриваться как признак конца строки.

Аналогичный метод read может затем прочитать эти символы в какой-то другой символьный массив и тоже без всякой обработки.

Теперь остановимся на операции «взять из потока» (>>). Эта операция извлекает данные из потока, заданного ее левым операндом, и заносит их в переменную, заданную правым операндом. Операция возвращает поток, указанный как ее левый операнд. Благодаря этому допускаются сцепленные операции «взять из потока». Например, оператор

infile >> i >> j;

прочтет, начиная с текущей позиции файла, связанного с потоком infile, два целых числа в переменные  i и  j.  Если в текущей позиции файла первому из чисел предшествуют пробельные символы или разделители, то они будут пропущены. За окончание числа операция примет первый отличный от цифры символ, в частности, пробельный. Поэтому, если эти два числа были ранее записаны в файл, например, оператором

outfile << i << ' ' << j << endl;

то они прочтутся нормально. Но если они были записаны оператором

outfile << i << j << endl;

т. е. без пробела, то их цифры будут слиты вместе и это составное число прочтется как  i,  а при чтении  j произойдет ошибка.