Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет197/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   193   194   195   196   197   198   199   200   ...   256
10.4.4 Члены istream 
Как и для ostream, большинство функций форматирования и управления вводом находится не в классе 
iostream, а в базовом классе ios. 
class istream : public virtual ios { 
//... 
public: 
int peek() 
istream& putback(char c); 
istream& seekg(streampos); 
istream& seekg(streamoff, seek_dir); 
streampos tellg(); 
//... 
}; 
Функции позиционирования работают как и их двойники из ostream. Окончание на букву g показывает, 
что именно позиция используется при вводе символов из заданного потока. Буквы p и g нужны
поскольку мы можем создать производный класс iostreams из классов ostream и istream, и в нем 
необходимо следить за позициями ввода и вывода. 
С помощью функции peek() программа может узнать следующий символ, подлежащий вводу, не 
затрагивая результата последующего чтения. С помощью функции putback(), как показано в $$10.3.3, 
можно вернуть ненужный символ назад в поток, чтобы он был прочитан в другое время. 
10.5 Файлы и потоки 
Ниже приведена программа копирования одного файла в другой. Имена файлов берутся из командной 
строки программы: 
#include  
#include  
void error(char* s, char* s2 ="") 

cerr << s << ' ' << s2 << '\n'; 
exit(1); 

int main(int argc, char* argv[]) 

if (argc != 3) error("wrong number of arguments"); 
ifstream 
from(argv[1]); 
if (!from) error("cannot open input file",argv[1]); 
ostream 
to(argv[2]); 
if (!to) error("cannot open output file",argv[2]); 
char 
ch; 
while (from.get(ch)) to.put(ch); 


Бьерн Страуструп.
Язык программирования С++ 
 
276 
if (!from.eof() || to.bad()) 
error("something 
strange 
happened"); 
return 
0; 

Для открытия выходного файла создается объект класса ofstream - выходной поток файла, 
использующий в качестве аргумента имя файла. Аналогично, для открытия входного файла создается 
объект класса ifstream - входной файловый поток, также использующий в качестве аргумента имя 
файла. В обоих случаях следует проверить состояние созданного объекта, чтобы убедиться в 
успешном открытии файла, а если это не так, операции завершатся не успешно, но корректно. 
По умолчанию ifstream всегда открывается на чтение, а ofstream открывается на запись. В ostream и в 
istream можно использовать необязательный второй аргумент, указывающий иные режимы открытия: 
class ios { 
public: 
//... 
enum 
open_mode 

in=1, 
// открыть на чтение 
out=2, 
// открыть как выходной 
ate=4, 
// открыть и переместиться в конец файла 
app=010, 
// добавить 
trunc=020, 
// сократить файл до нулевой длины 
nocreate=040, 
// неудача, если файл не существует 
noreplace=0100 
// неудача, если файл существует 
}; 
//... 
}; 
Настоящие значения для open_mode и их смысл вероятно будут зависеть от реализации. Будьте добры, 
за деталями обратитесь к руководству по вашей библиотеке или экспериментируйте. Приведенные 
комментарии могут прояснить их назначение. Например, можно открыть файл с условием, что операция 
открытия не выполнится, если файл уже не существует: 
void f() 

ofstream 
mystream(name,ios::out|ios::nocreate); 
if (ofstream.bad()) { 
//... 

//... 

Также можно открыть файл сразу на чтение и запись: 
fstream dictionary("concordance", ios::in|ios::out); 
Все операции, допустимые для ostream и ostream, можно применять к fstream. На самом деле, класс 
fstream является производным от iostream, который является, в свою очередь, производным от istream и 
ostream. Причина, по которой информация по буферизации и форматированию для ostream и istream 
находится в виртуальном базовом классе ios, в том, чтобы заставить действовать всю эту 
последовательность производных классов. По этой же причине операции позиционирования в istream и 
ostream имеют разные имена - seekp() и seekg(). В iostream есть отдельные позиции для чтения и 
записи. 


Достарыңызбен бөлісу:
1   ...   193   194   195   196   197   198   199   200   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет