Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

5.2. Ввод имен файлов

В примере, который мы только, что рассмотрели, имя файла было задано в программе в виде, так называемой, строки, т.е. текста заключенного в кавычки. О строках мы еще будем говорить позднее. А сейчас подумаем вот над чем. Нельзя ли имя файла прочитать из другого файла? Ответ можно предсказать – конечно, это возможно. Но чтобы не запутаться в файлах заранее дадим им имена. Рабочий файл в который записывается информация назовем workFaile.dat, а файл содержащий имя рабочего файла будем называть nameFile.

Далее поступим следующим образом. В разрабатываемой программе создадим массив символов nameWork[n] в который запишем имя рабочего файла в кавычках. Это значит, что размер массива n должен хотя бы на единицу превосходить количество символов в имени рабочего файла, в данном случае workFile.dat содержит 12 символов, т.е. величина n должна быть не менее 13. Напомним, что индексация элементов массива начинается с нуля. Если имя рабочего файла заранее неизвестно, то создавая такой массив следует заранее предусмотреть максимально возможный размер. После того как имя рабочего файла будет помещено в массив, последний можно записать в виде файла, подобно тому как мы только что сделали в предпоследнем примере. При необходимости это имя будет прочитано и программа создаст необходимые потоки ввода-вывода.

Как всегда рассмотрим пример. Создадим программу, которая вводит 4 целых числа. Затем спрашивает имя рабочего файла. После чего вычисляет разность соседних чисел, которая записывается в рабочий файл. Далее программа читает рабочий файл и выводит его на экран.

#include <iostream> //библиотека ввода вывода с использованием

//стандартных устройств

#include <fstream> //библиотека ввода из файла

#include <cstdlib> //библиотека вывода в файл

#include<windows>

using namespace std;

main(){

ifstream inStream; //объявление потока ввода из файла

ofstream outStream; //объявление потока вывода в файл

int number[4], diskr[3];

char nameWork[15]; //строка для записи имени рабочего файла

SetConsoleOutputCP(1251);

cout<<"Введите 4 числа \n";

for(int i=0; i<4;i++) {

cin>>number[i];

}

cout<<"Введите имя рабочего файла \n"; /*Имя файла в который

записываются числа*/

cin>>nameWork;

outStream.open("nameFile");//присоединение файла с именем к потоку

outStream<< nameWork; //запись имени рабочего файла в потоке

inStream.open("nameFile"); //присоединение файла с именем

// рабочего файла к входному потоку

for(int i=1; i<4;i++) {

number[i]=number[i]-number[i-1];

outStream<< number[i];

}

inStream.open(nameWork);

inStream.fail();

if (outStream.fail()){

cout<<"Не удается открыть файл character.dat\n";

exit(1);

}

for(int i=0; i<4; i++){

inStream>>diskr[i];

cout<< diskr[i];

}

inStream.close();

outStream.close();

cin >>number[0];

}

5.3. Манипуляторы

Параметры форматирования потока можно установить не только посредством установки и снятия флагов, но и с помощью специальных функций, которые называются манипуляторами. Манипуляторы можно включать в выражения ввода-вывода. На самом деле нам уже известен один манипулятор, это endl. Этот манипулятор позволяет выводить символы с новой строки.

Приведем пример:

cout<<”Пример манипулятора”<<endl;

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

Некоторые манипуляторы без параметров описаны в следующей таблице.

Манипулятор

Назначение

Функция

dec

Устанавливает флаг десятичной системы счисления.

При вводе и выводе

hex

Устанавливает флаг шестнадцатеричной системы счисления.

При вводе и выводе

oct

Устанавливает флаг восьмеричной системы счисления.

При вводе и выводе

ws

Пропускает пробельные символы – пробел, знаки табуляции ‘\t’ и ‘\v’, символ перевода строки ‘\n’, символ возврата каретки ‘\r’, символ перевода страницы ‘\f’.

Действует только при выводе.

endl

Обеспечивает включение в выходной поток символа новой строки и выгружает содержимое этого потока.

Действует только при выводе.

ends

Вставляет в поток нулевой символ ‘\0’, что соответствует признаку конца строки.

Действует только при выводе.

flush

“Сбрасывает” поток, т.е. переписывает содержимое буфера, связанного с потоком , на соответствующее устройство.

Действует только при выводе.

Здесь полезно заметить, что манипуляторы endl и ends играют важную роль при выводе. Без них нельзя гарантировать, что информация не останется в буфере.