Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tekhnologia_programmirovania.pdf
Скачиваний:
182
Добавлен:
08.04.2015
Размер:
1.76 Mб
Скачать

132

Глава 11. О файлах и командной строке

Целью данной главы является, в основном, знакомство с командной строкой программы. Для того, чтобы привести более содержательные примеры, кратко рассмотрена работа с файлами.

11.1. Знакомство с файлами

Файлом называется поименованная часть памяти диска, содержащая некоторый набор записей. Непосредственную работу с файлами выполняет операционная система. В языках программирования обычно имеются высокоуровневые средства для доступа к файлам. В C++ они объявлены в заголовочном файле fstream.h.

Для обозначения источника или приемника данных используется термин поток. Примерами потоков являются стандартные потоки для ввода cin и для вывода cout. Для чтения из файла или записи в файл создаются потоки, связанные с файлами. Существуют два вида потоков:

текстовые и бинарные.

Текстовый поток – это последовательность символьных строк, заканчивающихся символом новая строка ’\n’. При выводе перед каждым символом ’\n’ помещается символ возврата каретки ’\r’. При вводе происходит обратное преобразование – два символа ’\r’ и ’\n’ заменяются одним символом ’\n’. Необходимость такого преобразования вызвана различиями в фиксации признака новой строки в C++ и в операционной системе. В языке C++ новая строка обозначается единственным символом ’\n’, реально же на диске в файле хранятся оба символа ’\r’ и ’\n’, генерируемые нажатием клавиши Enter, которая

используется при завершении ввода очередной строки с помощью клавиатуры.

Бинарный поток – это последовательность байтов, которая не подвергается какому-либо преобразованию.

При каждом пуске программы открыты три стандартных потока:

cin

стандартный ввод,

cout

стандартный вывод,

cerr

стандартный приемник ошибок.

По умолчанию стандартный ввод связан с клавиатурой, стандартный вывод – с экраном дисплея. Стандартный ввод, и вывод можно перенаправить на файлы средствами операционной системы, о

О файлах и командной строке 133

чем будет говориться ниже. Поток cerr нельзя перенаправить на файл, он всегда связан с экраном (со стандартным утройством вывода).

В файле fstream.h объявлены специальные потоковые типы данных (классы) для работы с файлами. Это классы:

ifstream

для чтения из файла,

ofstream

для записи в файл.

Для работы с файлами в программе нужно определить переменные этих классов, например,

ifstream fin;

// Входной файловый поток

ofstream fout;

// Выходной файловый поток

Файловые потоки связываются с конкретными файлами функцией: open(char* filename),

аргументом которой является строка с именем файла, например,

fin.open(”InpData.txt”);

// InpData.txt файл для чтения

fout.open(”ResData.txt”);

// ResData.txt файл для записи

Для проверки успешности завершения функции open к потоку можно применить оператор !, который возвращает ненулевое значение при наличии ошибки. Например, проверить, что файл InpData.txt удалось открыть, можно следующим образом:

if(!fin != 0){

cerr << ”Не могу открыть файл” << ”InpData.txt”; exit(1);

}

По умолчанию потоки открываются на чтение и запись как текстовые. Работа с бинарными потоками будет рассмотрена позже.

Для файловых потоков применимы все рассмотренные ранее операторы и функции ввода и вывода.

Открытые файловые потоки закрываются автоматически при завершении программы или при выходе из функции, в которой потоки были созданы. Поток можно явно закрыть, вызвав для него функцию

close().

Программа 30. Копирование файлов

В приводимой далее программе открываются два файловых потока: один на чтение, другой на запись. Из входного файла производится построчное чтение, прочитанные строки выводятся на экран и в выходной файл. После чтения каждых 20 строк программа останавливается и ждет нажатия клавиши Enter.

134 11

//Файл CopyFile.cpp

//Файловый ввод и вывод #include <fstream.h> #include <conio.h>

#include <stdlib.h>

// Для exit

const int PAGE = 20;

// Максимальное число строк на странице

const int MAXLEN = 200;

// Максимальная длина строки

const int LenName = 13;

// Длина строки с именем файла

void main()

 

{

 

ifstream fin;

// Файловый поток для ввода

ofstream fout;

// Файловый поток для вывода

char filename[LenName];

// Массив для имени файла

char line[MAXLEN];

// Массив для строк

cout << "\nВведите имя входного файла ";

cin >> filename;

 

fin.open(filename);

 

if(!fin){

// Если не удалось открыть входной файл

cerr << "Не удалось открыть файл " << filename; exit(1);

}

cout << "\nВведите имя выходного файла "; cin >> filename;

fout.open(filename);

if(!fout){ // Если не удалось открыть выходной файл cerr << "Не удалось открыть файл " << filename;

exit(1);

}

 

int i = 0;

// Количество прочитанных строк

cin.get();

// Убираем код из cin

while(!fin.eof()){

// Пока не достигнут конец файла

fin.getline(line, MAXLEN);// Чтение строки из файла

i++;

// Увеличение счетчика

cout << line << '\n';

// Вывод строки на экран

fout << line << '\n';

// Вывод строки в файл

if(i % PAGE == 0)

// Если выведена очередная страница,

cin.get();

// ждем нажатия клавиши Enter

}

 

fin.close();

// Закрытие входного файла

fout.close();

// Закрытие выходного файла

getch();

 

}

Программа запрашивает имя входного файла и пытается открыть его на чтение. При открытии файла возможна неудача, например из-за

О файлах и командной строке 135

неправильно указанного имени, в этом случае программа завершается вызовом exit.

Если входной файл удалось открыть, запрашивается имя выходного файла и он открывается на запись. Здесь тоже возможна неудача, например, потому, что файл с указанным именем существует и открыт другой программой. В этом случае также вызывается функция exit, которая корректно завершит программу, закрыв ранее открытый входной файл.

Предварительный вызов cin.get() перед циклом while нужен по следующей причине. При выполнении инструкции:

cin >> filename;

оператор >> пропускает начальные пробелы, затем читает символы имени файла и заносит их в массив filename. Чтение набранных на клавиатуре символов заканчивается при поступлении любого пробельного символа, в том числе символа “новая строка”, который остается в буфере клавиатуры. Именно этот символ и извлекается из буфера с помощью cin.get(). Если этого не сделать перед циклом, то новая строка будет прочитана внутри цикла, в результате на экран будут выведены две порции из PAGE строк, а не одна.

11.2. Командная строка

Командная строка позволяет взаимодействовать с операционной системой путем ввода различных команд. В операционной системе DOS командная строка была основным способом управления компьютером, что было неудобно тем, что приходилось запоминать названия большого числа команд и их параметры. В операционной системе Windows командная строка скрыта за графическим интерфейсом, который спроектирован так, чтобы быть интуитивно понятным и не требовать от пользователя знания команд операционной системы. Однако командная строка не исчезла совсем. Она связана с любым ярлыком на Рабочем столе Windows и запускает программу,

связанную с этим ярлыком. Ее можно увидеть, посмотрев свойства ярлыка.

В Windows оставлена возможность непосредственно запускать

программы с помощью командной строки в окне, моделирующем работу DOS, которое открывается командой Пуск, Программы,

Стандартные, Командная строка. Для однократного выполнения какой либо команды можно командой Пуск, Выполнить открыть окно Запуск программы, рис.40, где ввести командную строку или вручную, или выбрав нужную программу с помощью кнопки Обзор.

136 11

На рис.41 показана командная строка для запуска программы 13, расположенной в файле Receipts.exe.

Рис.42. Запуск программы с помощью командной строки

При работе в TC программы можно запускать непосредственно из интегрированной среды командой меню Run, Run или комбинацией

клавиш Ctrl+F9, но иногда нужно опробовать запуск программы из

командной строки. Для этого в TC предусмотрен выход в среду операционной системы с помощью команды File, DOS shell. После

выполнения данной команды будет предъявлен текстовый экран, внизу которого расположена командная строка с курсором, рис.43. Здесь можно вводить команды и запускать их на выполнение нажатием Enter.

Рис.44. Экран Dos shell в TC

Команда dir выводит на экран полное содержимое текущего каталога. Чтобы показать нужную группу файлов, в команде dir следует указать маску файлов, например, команда

...> dir *.exe