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

Операцией >> можно вводить из файла строки в переменные типа string

Например, операторы:

strings;

infile >> s;

осуществляют чтение из файла в строку  s.  Но при этом читается не вся строка, а только одна лексема – последовательность символов, заканчивающаяся пробельным или разделительным символом.

Это удобно, если надо анализировать текст или искать в нем какое-то ключевое слово. Но это становится недостатком, если надо просто прочесть строку целиком (пример 2).

Пример 2

ofstream outfile("pr3.txt"); // Создание файла как выходного потока

// Пишем в файл

outfile << "Учимся программировать на языке C++, " << "Часть 2" <<

endl;

outfile << "НГТУ" << endl;

outfile << "РЭФ" << endl;

outfile.close();

string one, two,three;

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

// Читаем из файла

infile>>one;

infile >> two;

infile >> three;

// Выводим прочитанное на экран

cout<<one<<endl;

cout << two << endl;

cout << three << endl;

infile.close();

Результат

Учимся программировать на

Таким образом, вместо того чтобы прочесть три введенные в файл строки, мы не прочли целиком даже первую строку. Но этого и следовало ожидать, так как после выполнения оператораinfile>>one; из первой строки будет считана последовательность символов до первого пробела, т. е. слово «Учимся». Эти символы будут помещены в строку one. Далее оператором infile >> two; в строку two будет считано второе слово первой строки – «программировать» и т. д.

Для того чтобы прочитать всю строку, надо применить функцию getline. Существует две версии этой функции:

первая – getline(input,str,delim);

вторая – getline(input,str).

Здесь

input – поток , из которого считываются данные,

str – строка, в которую считываются данные,

delim – символ-разделитель.

Функция  getline  считывает неформатированные данные из потока в строку. Останавливается, как только найден символ, равный разделителю, или исчерпан поток. Первая версия использует в качестве разделителя  delim,  вторая – '\n'. Символ-разделитель удаляется из потока и не помещается в строку.

Таким образом, чтобы прочесть все строки в примере 2, необходимо операторы

infile>>one;

infile >> two;

infile >> three;

заменить на операторы

getline(infile,one);

getline(infile,two);

getline(infile,three);

А если бы мы применили первую версию этой функции во всех трех операторах, взяв в качестве delim пробел – ‘ ‘, то получили бы тот же результат, что и в примере 2.

Если в качестве входного потока, из которого считываются данные, используется поток  cinто оператор  getline(cin,str)  позволяет вводить с клавиатуры строку str, в которой отдельные слова разделены пробелами или другими разделительными символами.

В классе  ifstreamимеется еще один метода чтения из потока – get.

Функция getвводит одиночный символ из указанного потока (даже если это символ-разделитель) и возвращает этот символ в качестве значения вызова функции. Этот вариант функции getвозвращает EOF, когда в потоке встречается признак конца файла.

Следующий код использует функцию get, чтобы определить количество символов в файле.

Пример 3

ifstream infile("test.txt");

int i = 0;

char c;

while((c = infile.get()) != EOF)

{

 i++;

}

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

Функцию getудобно использовать для поиска в файле какого-то ключевого символа. Например, если в приведенный код добавить оператор  if(c=='Н')break,  то программа найдет и запомнит номер пози-ции, в которой первый раз встретился символ  Н.

Если требуется записать в файл вектор, то это можно сделать, например, следующим образом:

vector<double>v;

 ofstream outfile("имя_фала");

   /*Определениеитератора it как объекта класса ostream_iteratorдля чтения значений типа double . Конструктор этого объекта имеет два параметра: outfileэто поток, куда записываются данные и пробел, который будет выводиться после каждого значения. */