Операцией >> можно вводить из файла строки в переменные типа 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 – это поток, куда записываются данные и пробел, который будет выводиться после каждого значения. */
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.