Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Состояние потока.

Каждый поток (istream или ostream) имеет связанное с ним состояние. Обработка ошибок и нестандартных ситуаций осуществляется с помощью соответствующей установки и проверки этого состояния. В классе ios так же определены методы, позволяющие опрашивать состояние потока.

class ios { // базовый класс для istream и ostream

// ...

public:

int rdstate(); // возвращает текущее состояние потока

int eof(); // возвращает не 0, если установлен флаг конца файла

int fail(); // возвращает не 0, если произошла ошибка ввода-вывода

int good(); // возвращает не 0, если сброшены флаги

ошибок, т.е. все в порядке

void clear(); // восстанавливает поток в нормальное состояние

// ...

};

Если состояние состветствует good() или eof(), значит последняя операция ввода прошла успешно. Если состояние good(), то следующая операция ввода может пройти успешно, иначе она закончится неудачей. Т.е. применение операции ввода к потоку, который не находится в состоянии good(), является пустой операцией.

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

Использование аргументов командной строки.

Во многих операционных системах, например, в DOS и UNIX, имеется возможность передачи аргументов в функцию main из командной строки. Для этого нужно в список параметров функции main включить параметры int argc и char *argv[]. Параметр argc получает значение, равное количеству аргументов командной строки. Параметр argv - это массив строк, в который помещаются значения аргументов командной строки (argv[0] - имя самой программы). Обычно аргументы командной строки используются для задания опций выполнения программы и передачи программе имен файлов.

Пример.

// Использование аргументов командной строки

#include <fstream.h>

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

{

if(argc != 3)

{

cout << "Используйте формат: "

<< "copy имя_входного_файла имя_выходного_файла" << endl;

return;

}

ifstream input (argv[1], ios::in); // открыть файл по чтению

if (!input) cout << argv[1]

<< "нельзя открыть" << endl;

ofstream output (argv[2], ios::out); // открыть файл для записи

if (!output) cout << argv[2]

<< "нельзя открыть" << endl;

// в цикле производим посимвольное копирование данных из input в output

for ( int i = input.get(); !input.eof(); i = input.get())

output.put ( char (i));

}

В программе выполняется посимвольное копирвание одного файла в другой. Пусть исполняемый файл этой программы называется copy. Тогда командная строка при вызове copy, например в WINDOWS, "Выполнить... " будет выглядеть так

"C:\copy.exe" d:\ff1.txt d:\ff2.txt

Это команда вызывает копирование содержимого файла ff1.txt в файл ff2.txt. Если при выполнении программы значение параметра argc не будет равно 3 (copy, имя программы, учитывается как один из параметров), то программа выдает сообщение об ошибке и завершает работу. В противном случае, массив argv будет содержать строки "C:\copy.exe", "d:\ff1.txt" и "d:\ff2.txt". Если оба Файла ff1.txt и ff2.txt открыты успешно, программа считывает символы из ff1.txt функцией-членом get и записывает в ff2.txt функцией-членом put, пока не будет достигнут конец файла ff1. После этого программа завершается, результирующий файл будет точной копией файла ff1.txt.