Паппас К., Мюррей У. - Visual C++ 6. Руководство разработчика - 2000
.pdf#include <string.h> char newline;
class consumer { char name[60],
street[60], city[20], state[15], zip[10]; public: void data_output(void); void data_input(void); }; void consumer::data_output() {
cout << "Имя: " << name << endl; cout << "Улица* " << street << endl; cout << "Город: " << city << endl; cout << "Штат: " << state << endl; cout << "Индекс: " << zip << endl; void consumer: :data_input () {
cout<< "Введите полное имя клиента: "; cin.get (name, 59,'\n')>>'
cin.get(newline); // пропуск символа новой строки
cout << "Введите адрес: "; cin.get(street, 59,'\n'); cin.get(newline); cout << "Введите город: ";
cin.get(city, 19,'\n'); cin.get(newline) ;
cout<< "Введите название штата: "; cin.get(state, 14, '\n');
cin.get (newline);
cout << "Введите почтовый индекс: "; cin.get(zip, 9,'\n'); cin.get(newline);
}
class airline : public consumer { char airline_type[20];
float acc_air_miles; public: void airline_consumer(); void disp_air_mileage(); };
void airline : :airline_consumer () { data_input ( ) ;
cout << "Введите тип авиалиний : " ;
cin.get (airline_type, 19,'\n'); cin.get (newline) ; cout << "Введите расстояние, покрытое в авиарейсах: "; cin >> acc_air_miles; cin.get (newline) ; }
void airline : :disp_air_mileage () { data_output ( ) ;
cout << "Тип авиалиний: "" << airline_type << endl;
cout << "Суммарное расстояние: " << acc_air_miles << endl; class rental_car : public consumer {
char rental_car_type[20] ; float acc_road_miles; public: void rental_car_consumer ( ) ; void disp_road_mileage () ; };
void rental_car::rental_car_consumer() { data_input();
cout<< "Введите марку автомобиля: "; cin.get(rental_car_type, 19,'\n'); cin.get (newline) ;
cout << "Введите суммарный автопробег: "; cin >> acc_road_miles;
241
cin.get(newline);
}
void rental_car::disp_road_mileage() { data_output();
cout << "Марка автомобиля: "
<< rental_car_type << endl; cout << "Суммарный автопробег: " << acc_road_miles << endl;
} |
|
main() |
|
airline cons1; rental_car cons2; |
|
cout << "\n—Аренда самолета—\n"; |
cons1.airline_consumer(); |
cout << "\n—Аренда автомобиля—\n"; |
|
cons2.rental_car_consumer(); |
|
cout<< "\n—Аренда самолета—\n"; |
|
cons1.disp_air_mileage(); |
|
cout<< "\n—Аренда автомобиля—\n"; |
|
cons2 . disp_road_mileage(); |
|
return(0); |
|
} |
|
Переменные родительского класса consumerнедоступны дочерним классам, так как являются закрытыми. Поэтому для работы с ними созданы функции data_input () и data_output (), которые помещены в открытую часть класса и могут быть вызваны в производных классах.
242
Глава 15. Классы ввода-вывода в языке C++
•Иерархия классов ввода-вывода
•Файловый ввод
•Файловый вывод
oДвоичные файлы
•Буферы потоков
oСтроковые буферы
•Несколько примеров форматного вывода данных
Вглаве "Основы ввода-вывода в языке C++" были даны общие представления о потоковых объектах cin, cout и cerr и операторах потокового ввода-вывода << и >>. В настоящей главе мы поговорим о стандартных классах C++, управляющих работой этих объектов.
Иерархия классов ввода-вывода
Все потоковые классы порождены от одного класса, являющегося базовым в иерархии, — ios. Исключение составляют лишь классы буферизованных потоков, базовым для которых служит класс streambuf. Всех их можно разделить на четыре категории, как показано в табл. 15.1.
На рис. 15.1 схематически изображена иерархия классов ввода-вывода, порожденных от класса ios.
Классы семейства ios предоставляют программный интерфейс и обеспечивают необходимое форматирование обрабатываемых данных, тогда как непосредственную обработку данных выполняют классы семейства streambuf, управляющие обменом данными между буфером потока и конечным устройством (рис. 15.2).
Таблица 15.1. Категории классов ввода-вывода
Класс |
Описание |
|
|
|
|
ios |
Содержит базовые средства управления потоками, является родительским |
|
для других классов ввода-вывода (файл IOSTREAM.H) |
||
|
||
|
|
|
Потоковый ввод |
|
|
|
|
|
istream |
Содержит общие средства потокового ввода, является родительским для |
|
других классов ввода (файл IOSTREAM.H) |
||
|
||
|
|
|
ifstream |
Предназначен для ввода данных из файлов (файл FSTREAM.H) |
|
|
|
|
|
Поддерживает операцию присваивания; существует предопределенный объект cin данного |
|
istream_withassign |
класса, по умолчание читающий данные из стандартного входного потока, но благодаря |
|
|
операции присваивания этот объект может быть переадресован на различные объекты класса |
|
|
istream(файл IOSTREAM.H) |
|
|
|
|
istrstream |
Предназначен для ввода данных из строковых буферов (файл STRSTREA.H) |
|
|
|
|
Потоковый вывод |
|
|
|
|
|
ostream |
Содержит общие средства потокового вывода, является родительским для других классов |
|
вывода (файл IOSTREAM.H) |
||
|
||
|
|
|
ofstream |
Предназначен для вывода данных в файлы (файл FSTREAM.H) |
|
|
|
|
|
Поддерживает операцию присваивания; существуют предопределенные объекты cout, cerr и |
|
ostream_withassign |
clog данного класса, по умолчанию выводящие данные в стандартный выходной поток, но |
|
благодаря операции присваивания их можно переадресовать на различные объекты класса |
||
|
ostream (файл IOSTREAM.H) |
|
|
|
|
ostrstream |
Предназначен для вывода данных в строковые буферы (файл STRSTREA.H) |
|
|
||
Потоковый ввод-вывод |
||
|
|
|
iostream |
Содержит общие средства потокового ввода-вывода, является родительским для других |
|
классов ввода-вывода (файл IOSTREAM.H) |
||
|
||
|
|
|
fstream |
Предназначен для организации файлового ввода-вывода (файл FSTREAM.H) |
243
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strstream |
Предназначен для ввода-вывода строк (файл STBLSTREA.H) |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stdiostream |
Поддерживает работу с системными средствами стандартного ввода-вывода, существует для |
||||||||||||
совместимости со старыми функциями ввода-вывода (файл STDIOSTR.H) |
|||||||||||||
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||
Буферизованные потоки |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
streambuf |
Содержит общие средства управления буферами потоков, является родительским для других |
||||||||||||
буферных классов (файл IOSTREAM.H) |
|||||||||||||
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
filebuf |
Предназначен для управления буферами дисковых файлов (файл FSTREAM.H) |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strstreambuf |
Предназначен для управления строковыми буферами, хранящимися в памяти (файл |
||||||||||||
STRSTREA.H) |
|||||||||||||
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stdiobuf |
Осуществляет буферизацию дискового ввода-вывода с помощью стандартных системных |
||||||||||||
функций (файл STDIOSTR.H) |
|||||||||||||
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 15.1. Иерархия классов ввода-вывода порожденных от ios
Рис. 15.2. Иерархия классов, порожденных от streambuf
Файловый ввод
Основные функции управления потоковым вводом сосредоточены в классе istream. С каждым из объектов этого класса и его производных связан объект класса streambuf. Эти классы работают в связке: первый осуществляет форматирование, а второй управляет низкоуровневым буферизованным вводом. Функции класса istream, доступные его потомкам, перечислены в табл. 15.2.
Функция |
Описание |
|
|
|
|
ipfx |
Вызывается перед операцией чтения для проверки наличия ошибок в потоке |
|
|
|
|
isfx |
Вызывается после каждой операции чтения |
|
|
|
|
get |
Извлекает из потока требуемое число символов; если указан символ-ограничитель, он не извлекается |
|
|
|
|
getline |
Извлекает из потока требуемое число символов; если указан символ-ограничитель, он извлекается, но не |
|
сохраняется в буфере |
||
|
||
|
|
|
read |
Извлекает из потока требуемое число байтов; применяется при работе с двоичными потоками |
|
|
|
244
ignore |
Выбрасывает из потока требуемое число символов вплоть до символа-ограничителя |
|
|
peek |
Возвращает текущий символ, сохраняя его в потоке |
|
|
gcount |
Определяет число символов, извлеченных из потока во время последней операции чтения |
|
|
eatwhite |
Извлекает из потока ведущие пробельные символы; аналогичное действие выполняет манипулятор ws |
|
|
putback |
Возвращает в поток символы, извлеченные из него во время последней операции чтения |
|
|
sync |
Синхронизирует внутренний буфер потока с внешним источником символьных данных |
|
|
seekg |
Перемещает маркер, обозначающий текущую позицию чтения, на требуемую позицию в потоке |
|
|
tellg |
Возвращает позицию маркера чтения |
Таблица 15.2. Функции класса istream
Класс ifstream является потомком класса istream, ориентированным на чтение данных из файлов. Его конструктор автоматически создает объект класса filebuf, управляющий низкоуровневой работой с файлом, включая поддержку буфера чтения. Функции класса ifstream перечислены в табл. 15.3.
Таблица 15.3. Функции класса ifstream
ФУНКЦИЯ Описание
open |
Открывает файл для чтения, связывая с ним объект класса filebuf |
|
|
close |
Закрывает файл |
|
|
setbuf |
Передает указанный символьный буфер в распоряжение объекта класса filebuf |
|
|
setmode |
Задает режим доступа к файлу: двоичный (константа filebuf:: binary) или текстовый (константа filebuf:: |
|
text) |
|
|
attach |
Связывает указанный открытый файл с объектом класса filebuf |
|
|
rdbuf |
Возвращает указатель на объект класса filebuf |
|
|
fd |
Возвращает дескриптор файла |
|
|
is_open |
Проверяет, открыт ли файл, связанный с потоком |
В следующей программе из файла читаются данные блоками по 80 символов, которые затем выводятся на экран:
//
// ifstream.cpp
//В этой программе на языке C++ демонстрируется
// использование класса ifstreamдля чтения данных из файла.
//
#include <fstream.h> #define iCOLUMNS 80 void main(void)
{
charcOneLine[iCOLUMNS];
fstream ifMyInputStream("IFSTREAM.CPP"); while(ifMylnputStream) { ifMylnputStream.getline(cOneLine, iCOLUMNS); cout << '\n' << cOneLine;
}
ifMylnputStream.close();
}
Конструктор клаccа ifstream создает объект ifMylnputStream, связывая с ним файл IFSTREAM.CPP, который открывается для чтения (по умолчанию в текстовом режиме). Этот объект можно использовать в условных операторах, проверяя его на равенство нулю, что означает достижение конца файла.
Функция getline(), унаследованная от класса istream, читает в массив cOneLineстроку текста длиной iCOLUMNS(80 символов). Ввод будет прекращен при обнаружении символа новой строки \n, конца файла или, если ни одно из этих событий не произошло, 79-го по счету символа (последним записывается символ \0).
245
После окончания вывода всего файла он закрывается командой close().
Файловый вывод
Основные функции управления потоковым выводом сосредоточены в классе ostream. С каждым из объектов этого класса и его производных связан объект класса streambuf. Эти классы работают в связке: первый осуществляет форматирование, а второй управляет низкоуровневым буферизованным выводом. Функции класса ostream, доступные его потомкам, перечислены в табл. 15.4.
Таблица 15.4. Функции класса ostream
Функция |
Описание |
|
|
opfx |
Вызывается перед каждой операцией записи для проверки наличия ошибок в потоке |
|
|
оsfx |
Вызывается после каждой операции записи для очистки буфера |
|
|
put |
Записывает в поток одиночный байт |
|
|
write |
Записывает в поток требуемое число байтов |
|
|
flush |
Очищает буфер потока; аналогичное действие выполняет манипулятор flush |
|
|
seekp |
Перемещает маркер, обозначающий текущую позицию записи, на требуемую позицию в потоке |
|
|
tellp |
Возвращает позицию маркера записи |
Класс ofstream является потомком класса ostream, ориентированным на запись данных в файлы. Его конструктор автоматически создает объект класса filebuf, управляющий низкоуровневой работой с файлом, включая поддержку буфера записи. Класс ofstream содержит такой же набор функций, что и класс ifstream(см. табл. 15.3).
В следующей программе в файл дважды записывается одна и та же строка — посимвольно и вся целиком.
//
//ofstream. cpp
//В этой программе на языке C++ демонстрируется
//использование класса ofstreamдля записи данных в
//файл, открытый в текстовом режиме.
#include <fstream.h> #include <string.h> #define iSTRING_MAX 40 void main (void) {
int i = 0;
char pszString [iSTRING_MAX] •= "Записываемая строка\n";
//файл по умолчанию открывается в текстовом режиме ofstream ofMyOutputStream("OFSTREAM.OUT") ;
//строка выводится символ за символом;
//обратите внимание, что символ '\n' .
//преобразуется в два символа while (pszString[i] != '\0'){
ofMyOutputStream.put (pszStringfi] ) ;
cout<< !'\nПозиция маркера записи: " << ofMyOutputStream.tellp() ; i++; }
//запись всей строки целиком
ofMyOutputStream.write(pszString, strlen(pszString));
cout<< "\nНовая позиция маркера записи: " << ofMyOutputStream.tellp(); ofMyOutputStream.close() ; -}
Вот результаты работы программы:
Позиция маркера записи: |
1 |
||
Позиция |
маркера |
записи: |
2 |
Позиция |
маркера |
записи: |
3 |
246
.
.
.
Позиция маркера записи: 18 Позиция маркера записи: 19 Позиция маркера записи: 21 Новая позиция маркера записи: 42
Цикл while последовательно, символ за символом, с помощью функции put() записывает содержимое строки pszstring в выходной поток. После вывода каждого символа Вызывается функция tellp(),возвращающая текущую позицию маркера записи. Результатам работы этой функции следует уделить немного внимания.
Строка pszString содержит 20 символов плюс концевой нулевой символ (\0), итого — 21. На хотя, если судить по выводимой информации, в поток записывается 21 символ, последним из них будет не \0. Его вообще не окажется в файле. Дело в том, что при выводе данных в файл, открытый в текстовом режиме, автоматически выполняется преобразование \n = CR/LF, т.е. символ новой строки преобразуется в пару символов возврата каретки и перевода строки. (При чтении происходит обратное преобразование.) Именно поэтому наблюдается "скачок" счетчика: после 19 идет 21. Функция put(), записывающая в файл символ \n, на самом деле помещает в файл два других символа.
Функция write() выполняет такое же преобразование, поэтому конечное значение счетчика равно 42, а не 41.
Двоичные файлы
Следующая программа аналогична предыдущему примеру и иллюстрирует, что произойдет, если ту же самую строку вывести в тот же самый файл, только открытый в двоичном режиме.
//
//binary.срр
//Эта программа является модификацией предыдущего примера
//и демонстрирует работу с файлом,открытым в двоичном режиме.
#include <fstream. h> #include <string.h> #define iSTRING_MAX 40 void main (void) << int i = 0;
char pszString [iSTRING_MAX] = "Записываемая строка\n";
//файл открывается в двоичном режиме
ofstream ofMyOutputStream("OFSTREAM.OUT", ios :: binary)
//строка выводится символ за символом;
//обратите внимание, что символ ' \n '
//никак не преобразуется
while (pszString [i]!= '\0') { ofMyOutputStream.put (pszString [i]);
cout <<' "\nПозиция маркера записи: << ofMyOutputStream.tellpO ;
i++> 1 |
|
// запись всей строки целиком |
. |
ofMyOutputStream.write(pszString, strlen(pszString)), cout<< "\nНовая позиция маркера записи: "
<< ofMyOutputStream.tellp() ; ofMyOutputStream.close() ;
}
Вот результаты работы программы:
Позиция маркера записи: 1
247
Позиция маркера записи: 2 Позиция маркера записи: 3 Позиция маркера записи: 18 Позиция маркера записи: 19 Позиция маркера записи: 20 Новая позиция маркера записи: 40
При выводе строки pszString не происходит замены концевого символа \n парой символов возврата каретки и перевода строки, поэтому в поток записывается 20 символов — ровно столько, сколько содержится в строке.
Буферы потоков
В основе всех буферизованных потоков ввода-вывода в C++ лежит класс streambuf. В этом классе описаны основные операции, выполняемые над буферами ввода-вывода (табл. 15.5). Любой класс, порожденный от ios, наследует указатель на объект класса streambuf. Именно последний выполняет реальную работу по вводу и выводу данных.
Объекты класса streambuf управляют фиксированной областью памяти, называемой также областью резервирования. Она, в свою очередь, может быть разделена на область ввода и область вывода, которые могут перекрывать друг друга.
Класс streambuf является абстрактным, т.е. создать его объект напрямую нельзя (его конструктор является защищенным и не может быть вызван из программы). В то же время, имеются три производных от него класса, предназначенные для работы с потоками конкретного типа: filebuf (буферы дисковых файлов), strstreambuf (строковые буферы, хранящиеся в памяти) и stdiobuf (буферизация дискового ввода-вывода с помощью стандартных системных функций). Кроме того, можно создавать собственные классы, порожденные от streambuf, переопределяя его виртуальные функции (табл. 15.6) и настраивая, таким образом, его работу в соответствии с потребностями конкретного приложения. Только из производных классов можно вызывать и многочисленные защищенные функции этого класса, управляющие областью резервирования (табл. 15.7).
Таблица 15.5. Открытые функции класса streambuf
Открытая функция Описание
|
in_avail |
Возвращает число символов в области ввода |
|
|
|
|
|
|
sgetc |
Возвращает символ, на который ссылается указатель области ввода; при этом указатель не |
|
|
перемещается |
||
|
|
||
|
|
|
|
|
snextc |
Перемещает указатель области ввода на одну позицию вперед, после чего возвращает |
|
|
текущий символ |
||
|
|
||
|
|
|
|
|
sbumpc |
Возвращает текущий символ и затем перемещает указатель области ввода на одну позицию |
|
|
вперед |
||
|
|
||
|
|
|
|
|
stossc |
Перемещает указатель области ввода на одну позицию вперед, но не возвращает символ |
|
|
|
|
|
|
sputbaqkc |
Перемещает указатель области ввода на одну позицию назад, возвращая символ в буфер |
|
|
|
|
|
|
sgetn |
Читает требуемое количество символов из буфера |
|
|
|
|
|
|
out_waiting |
Возвращает число символов в области вывода |
|
|
|
|
|
|
sputc |
Записывает символ в буфер и перемещает указатель области вывода на одну позицию вперед |
|
|
|
|
|
|
sputn |
Записывает требуемое количество символов в буфер и перемещает указатель области вывода |
|
|
на соответствующее число позиций |
||
|
|
||
|
|
|
|
|
dbp |
В текстовом виде записывает в стандартный выходной поток различного рода информацию о |
|
|
состоянии буфера |
||
|
|
||
|
|
|
|
|
|
|
|
|
Таблица 15.6. Виртуальные функции класса streambuf |
||
|
|
|
|
|
Виртуальная |
|
Описание |
|
функция |
|
|
|
|
|
|
|
|
|
|
|
sync |
|
Очищает области ввода и вывода |
|
|
|
|
|
setbuf |
|
Добавляет к буферу указанную зарезервированную область памяти |
|
|
|
|
|
seekoff |
|
Перемещает указатель области ввода или вывода на указанное количество байтов |
|
|
относительно текущей позиции |
|
|
|
|
|
|
|
|
|
248
|
|
|
|
seekpos |
Перемещает указатель области ввода или вывода на указанную позицию относительно начала |
||
потока |
|||
|
|||
|
|
|
|
overflow |
Очищает область вывода |
||
|
|
|
|
underflow |
Если область ввода пуста, заполняет ее данными из источника |
||
|
|
|
|
pbackfail |
Вызывается функцией sputbackc() в случае неудачной попытки вернуться назад на один |
||
символ |
|||
|
|||
|
|
|
|
|
|
||
Таблица 15.7. Защищенные фугкции класса streambuf |
|||
|
|
|
|
Защищенная |
|
Описание |
|
функция |
|
||
|
|
||
|
|
|
|
base |
|
Возвращает указатель на начало области резервирования |
|
|
|
|
|
ebuf |
|
Возвращает указатель на конец области резервирования |
|
|
|
|
|
blen |
|
Возвращает размер области резервирования |
|
|
|
|
|
phase |
|
Возвращает указатель на начало области вывода |
|
|
|
|
|
pptr |
|
Возвращает значение указателя области вывода |
|
|
|
|
|
epptr |
|
Возвращает указатель на конец области ввода |
|
|
|
|
|
eback |
|
Возвращает указатель на начало области ввода |
|
|
|
|
|
gptr |
|
Возвращает значение указателя области ввода |
|
|
|
|
|
egptr |
|
Возвращает указатель на конец области вывода |
|
|
|
|
|
setp |
|
Задает значения указателей, связанных с областью вывода |
|
|
|
|
|
setg |
|
Задает значения указателей, связанных с областью ввода |
|
|
|
|
|
pbump |
|
Перемещает указатель области вывода на указанное число байтов относительно текущей |
|
|
позиции |
||
|
|
||
|
|
|
|
gbump |
|
Перемещает указатель области ввода на указанное число байтов относительно текущей |
|
|
позиции |
||
|
|
||
|
|
|
|
setb |
|
Задает значения указателей, связанных с областью резервирования |
|
|
|
|
|
unbuffered |
|
Задает или возвращает значение переменной, определяющей состояние буфера |
|
|
|
|
|
allocate |
|
Вызывает виртуальную функцию deallocate для создания области резервирования |
|
|
|
|
|
deallocate |
|
Выделяет память для области резервирования (виртуальная функция) |
|
|
|
|
Классы файловых потоков, такие как ifstream, ofstream и fstream, содержат встроенный объект класса filebuf, который вызывает низкоуровневые системные функции для управления буферизованным файловым вводом-выводом. Для объектов класса filebuf области ввода и вывода, а также указатели текущей позиции чтения и записи всегда равны друг другу. Функции этого класса перечислены в табл. 15.8.
Таблица 15.8.Функции класса filebuf
Функция |
Описание |
|
|
open |
Открывает файл, связывая с ним объект класса filebuf |
|
|
close |
Закрывает файл, "выталкивая" все содержимое области вывода |
|
|
setmode |
Задает режим доступа к файлу: двоичный (константа filebuf:: binary) или текстовый (константа filebuf: :text) |
|
|
attach |
Связывает указанный открытый файл с объектом класса filebuf |
|
|
fd |
Возвращает дескриптор файла |
|
|
is_open |
Проверяет, открыт ли файл, связанный с потоком |
В следующей программе создаются два файловых объекта: fbMylnputBuf и fbMyOutputBuf. Оба они открываются в текстовом режиме с помощью функции open(): первый — для чтения, второй — для записи. Если при открытии файлов не возникнет никаких ошибок, то каждый из них связывается с соответствующим объектом класса istream и ostream. Далее в цикле while символы читаются из файла fbMylnputBuf с помощью функции get() класса istream и записываются в файл fbMyOutputBuf с помощью функции put() класса ostream. Подсчет числа строк осуществляется с помощью выражения
iLineCount += (ch == '\n');
Когда в поток помещается символ \n, выражение в скобках возвращает 1 и счетчик iLineCount увеличивается на единицу, в противном случае он остается неизменным.
249
Оба файла закрываются с помощью функции close().
//
//filebuf.cpp
//Эта программа на языке C++ демонстрирует, как работать
//с объектами класса filebuf.
//
#include <f stream. h> t#include <process.h>
// содержит прототип функции exit() void main (void)
{
char ch;
int iLineCount = 0;
filebuf fbMylnputBuf, fbMyOutputBuf;
fbMylnputBuf .open ("FILEBUF.CPP", ios::in); if (fbMylnputBuf
.is_open()== 0) (
cerr<< "Невозможно открыть файл для чтения" exit (1);
}
istream is(SfbMylnputBuf) ;
fbMyOutputBuf.open("output.dat",ios::out); if(fbMyOutputBuf.is_open() == 0) {
cerr<< "Невозможно открыть файл для записи"; exit(2); }
ostream os(SfbMyOutputBuf); while (is) {
is.get(ch);
os.put(ch);
iLineCount += (ch== '\n');
}
bMylnputBuf. close (); fbMyOutputBuf.close();
cout << "Файл содержит " << iLineCount << " строк";
}
Cтроковые буферы
Класс strstreambuf управляет символьным буфером, расположенным в динамической памяти.
Несколько примеров форматного вывода данных
В первом примере на экран выводится список факториалов чисел от 1 до 25 с выравниванием влево:
//
//fact.cpp
//Эта программа на языке C++ выводит список факториалов чисел от 1
до 25.
//
#include <iostream.h> main ()
{
double number = 1.0,factorial = 1.0;
cout .precision (0); //0 цифрпослезапятой
cout .setf (ios:: left) ; // выравнивание влево
250
- #13.08.201334.52 Mб91Липман С., Лажойе Ж., Му Б. - Язык программирования C++. Вводный курс - 2007.djvu
- #13.08.201347.18 Mб127Литвиненко Н.А. - Технология программирования на C++. Win32 API-приложения - 2010.djvu
- #
- #
- #13.08.201317.53 Mб103Оберг Р., Торстейсон П. - Архитектура .NET и программирование на Visual C++ - 2002.pdf
- #
- #
- #
- #
- #
- #