4 (779941), страница 4
Текст из файла (страница 4)
Функция с прототипом
istream& get(streambuf& buf, char = '\n');
извлекает из входного потока символы и помещает их в буфер, определенный первым параметром. Чтение продолжается до появления ограничивающего символа, которым по умолчанию является '\n', но он может быть установлен явно любым образом.
Три следующих варианта функции get() позволяют прочесть из входного потока один символ. Функции
istream& get(unsigned char& cc) ;
istream& get(signed char& cc) ;
присваивают извлеченный символ фактическому параметру и возвращают ссылку на поток, из которого выполнено чтение. Функция
int get() ;
получает код извлеченного из потока символа в качестве возвращаемого значения. Если поток пуст, то возвращается код конца файла EOF.
Функции "ввода строк":
istream& getline(signed char *array, int len, char= '\n');
istream& getline(unsigned char *array, int len, char= '\n');
подобны функциям get () с теми же сигнатурами, но переносят из входного потока и символ-ограничитель. Функция
int peek () ;
позволяет "взглянуть" на очередной символ входного потока. Точнее, она возвращает код следующего символа потока (или EOF, если поток пуст), но оставляет этот символ во входном потоке. При необходимости этот символ можно в дальнейшем извлечь из потока с помощью других средств библиотеки. Например, следующий цикл работает до конца строки (до сигнала от клавиши Enter ):
char cim;
while (cin.peek() != '\n')
{ cin.get(cim);
cout.put(cim) ; }
Принадлежащая классу istream функция
istream& putback (char cc);
не извлекает ничего из потока, а помещает в него символ cc, который становится текущим и будет следующим извлекаемым из потока символом.
Аналогичным образом функция
int gcount ();
подсчитывает количество символов, которые были извлечены из входного потока при последнем обращении к нему. Функция
istream& ignore(int n=l, int EOF);
позволяет извлечь из потока и "опустить" то количество символов n, которое определяется первым параметром. Второй параметр определяет символ-ограничитель, при появлении которого выполнение функции нужно прекратить, даже если из потока еще не извлечены все n символов. Функции
istream& read(signed char *array, int numb);
istream& read(unsigned char *array, int numb);
выполняют чтение заданного количества numb символов в массив array.
Полезны следующие функции того же класса istream:
istream& seekg(long pos) ;
устанавливает позицию чтения из потока в положение, определяемое значением параметра.
istream& seekg(long pos, seek_dir dir);
выполняет перемещение позиции чтения вдоль потока в направлении, определенном параметром dir, принимающим значения из перечисления enum seek_dir {beg, cur, end }. Относительная величина перемещения (в байтах) определяется значением параметра long pos. Если направление определено как beg, то смещение от начала потока; cur - от текущей позиции; end - от конца потока;
long tellg()
определяет текущую позицию чтения из потока.
Подобные перечисленным функции класса ostream:
long tellp()
определяет текущую позицию записи в поток:
ostream& seekp (long pos, seek_dir dir)
аналогична функции seekg () , но принадлежит классу ostream
и выполняет относительное перемещение позиции записи
в поток;
ostream& seekp(long pos);
устанавливает абсолютную позицию записи в поток.
Использование аргументов командной строки
Данные в функцию main() можно передавать через параметры из командной строки (строки запуска функции на выполнение из операционной системы). Это удобно при отладке программы (чтобы не вводить при каждом запуске одни и те же данные) и может быть удобным при использовании программы.
При использовании функции main() с параметрами в командной строке заголовок функции имеет вид:
int main(int argc, char* argv[]), где:
argc – количество параметров;
argv[] – массив указателей на параметры (каждый параметр – строка).
Первый параметр, argv[0] – указатель на полное имя исполняемого файла. Он передается по умолчанию и не указывается при запуске программы.
Для выполнения программы с аргументами в командной строке нужно уметь:
- запустить программу с параметрами в командной строке;
- проконтролировать из программы количество параметров;
- использовать параметры из командной строки в тексте программы.
Запуск программы с параметрами в командной строке можно осуществить непосредственно из командной строки ДОС или из среды программирования Microsoft Visual C++.
Для запуска из Microsoft Visual C++ нужно:
- открыть меню Project;
- выбрать пункт Settings…;
- в окне Program settings выбрать закладку Debug;
- в поле Program arguments через пробел ввести необходимые параметры.
Для запуска из командной строки ДОС нужно выполнить следующие действия:
- на Рабочем столе Windows нажать кнопку ПУСК;
- в раскрывшемся меню выбрать пункт ВЫПОЛНИТЬ;
- с помощью кнопки ОБЗОР… найти нужный файл с расширением .exe;
- в окне Открыть: после символа “, стоящего в конце полного имени файла, через пробел ввести необходимые параметры.
При контроле числа параметров нужно иметь ввиду, что первый параметр всегда передается по умолчанию и число параметров будет на 1 больше, чем введено. Например, если передается один параметр - имя файла с исходными данными, то argc будет равно 2, argv[0] указывает на полное имя исполняемого модуля (точнее, на список параметров системного окружения, первым из которых является имя исполняемого файла), а argv[1] указывает на введенное имя файла с данными.
При использовании параметров нужно помнить, что каждый передаваемый параметр – это символьная строка. Если надо передать численное значение, то в программе надо преобразовать строку в число с помощью соответствующей типу числа функции (doubl atof(char *str), int atoi(char *str), или long atol(char *str)).
В качестве примера работы с файловыми потоками приведем программу копирования одного файла в другой. Имена файлов берутся из аргументов командной строки:
// МуСору.срр
#include <iostream>
#include <fstream>
#include "ConsolCyr.h"
using namespace std;
int main(int argc, char* argv[])
{
if (argc != 3) cout <<"Неверное число аргументов"<<endl;
ifstream from(argv[1]); // открываем входной файл
if (!from)
{
cout<<"Входной файл "<< argv[1 ]<<" не найден"<<endl;
return 1;
}
ofstream to(argv[2]); // открываем выходной файл
if (!to)
{
cout<<"Выходной файл "<< argv[2]<< " не открыт"<< endl;
return1;
}
char ch;
while (from.get(ch))
{
to.put(ch);
if (!to) cout<<"Ошибка записи (диск переполнен).";
}
cout << "Копирование из " << argv[1] << " в " << argv[2] << " завершено." << endl;
return 0;
}
1 Цезарь для шифрования своих посланий использовал следующий прием. При кодировании и декодировании писем он заменял буквы в письме на следующие по алфавиту буквы с постоянным смещением, равным 13, то есть к порядковому номеру буквы в латинском алфавите, содержащим 26 букв, он прибавлял 13 и получал порядковый номер буквы в кодируемом (декодируемом) письме. Если полученный таким образом номер буквы был больше 26, то он уменьшался на 26.
2 Если во вводимой строке больше символов, чем может вместить выделенная для ее хранения область, поведение программы не определено. Скорее всего, она завершится аварийно
3 Синонимом термина «метод» является «компонентная функция».
4 Символ перевода строки '\n' появляется во входном потоке, когда вы нажимаете клавишу Enter