Рядки з пропусками
Підхід, продемонстрований в останньому прикладі, не дозволяє обробляти рядки з char*, що містять пропуски. Для того, щоб ця ситуація змінилася, слід після кожного рядка писати спеціальний символ-обмежувач і використовувати функцію getline() замість оператора видобування. Наступна програма 26.4 виводить рядки з пропусками.
#include<fstream>
int main()
{
ofstream outfile("TEST.TXT");
outfile<<"11111111111\n";
outfile<<"22222222222\n";
outfile<<"33333333333\n";
outfile<<"44444444444\n";
return 0;
}
Програма 26.4
Коли ми запустимо програму, 4 рядки будуть записані в файл. Кожен рядок закінчується символом розділення рядків('\n'). Зверніть увагу: це рядки типу char*, а не об’єкти класу string. Багато потокових операцій значно зручніше здійснювати з цим типом даних.
Щоб видобути ці рядки з файлу, ми створимо ifstream і будемо читати рядок за рядком функцією getline(), що є методом класу istream. Ця функція зчитує всі символи, включаючи розділювачі, доки не дійде до спеціального символа ‘\n’, а потім поміщає результат читання в буфер, переданий їй в якості аргументу. Максимальний розмір буферу передається за допомогою другого аргументу Його вміст виводиться на екран після зчитування кожного рядка.
Програма закінчить роботу тоді, коли зустріне ознаку закінчення файлу (EOF). Врахуємо, що цю програму не можна використовувати для читання довільних файлів – кожен рядок повинен закінчуватися символом ‘\n’. При спробі прочитати файл іншої структури програма зависне.
#include<fstream>
#include <conio>
using namespace std;
int main()
{const int MAX=80;
char buffer[MAX];
ifstream infile("test.txt");
while(!infile.eof())
{infile.getline(buffer,MAX);
cout<<buffer<<endl;
}
getch();
return 0;
}
Програма 26.4а
Визначення ознаки кінця файлу (eof)
Об’єкти породжених з ios класів містять прапори статусу помилок, за допомогою яких можна перевірити результат виконання операцій. При читанні файлу невеликими порціями, як у попередньому прикладі, ми рано чи пізно наткнемося на ознаку кінця файлу. Сигнал EOF посилається в програму операційною системою, якщо більше немає даних для читання. В програмі 26.4а ця умова зустрічалася у виразі
while(!infile.eof())
Це все чудово, але треба врахувати, що, перевіряючи перевіряючи конкретний прапор ознаки кінця файлу, ми не перевіряємо всі інші прапори помилок. А failbit та badbit теж можуть виникнути при роботі програми, хоча це трапляється доволі рідко. Щоб перевірити все, ми замінимо умову циклу, як показано в програмі 26.4b
#include<fstream>
#include <conio>
using namespace std;
int main()
{const int MAX=80;
char buffer[MAX];
ifstream infile("test.txt");
while(infile.good())
{infile.getline(buffer,MAX);
cout<<buffer<<endl;
}
getch();
return 0;
}
Програма 26.4b
Можна також перевірити поток напряму. Будь-який потоковий об’єкт, наприклад, infile, має значення, яке може тестуватися на предмет виявлення найпоширеніших помилок, включаючи eof. Якщо яке-небудь з умов помилки має значення true, об’єкт повертає нуль. Якщо все йде гаразд, то об’єкт повертає ненульове значення. Це значення насправді є вказівником, але повернута «адреса» ніякого змістового навантаження не несе – вона просто повинна бути нулем або не нулем. Тому можна записати ще один варіант циклу while
while (infile)
Дата добавления: 2015-08-26; просмотров: 587;