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

Ввод/вывод массива в/из файл(-а).

Программа в зависимости от выбора пользователя позволяет ввести данные из массива в файл или вывести массив из уже существующего файла на экран. При попытке вывести данные из несуществующего файла выдается сообщение об ошибке. Данные выводятся в файл в следующем формате: в первой строке - размерность массива (через пробел количество строк и столбцов), далее - элементы массива по строкам.

#include<fstream.h>

#include<stdlib.h>

#include<iomanip.h>

void main()

{

char sl;

// вывод на экран меню

do

{

cout << "Выберите: 1. Вывести данные из файла "

<< "2. Записать данные в файл";

cin >> sl;

} while (sl!='1' && sl!='2');

char fileName[80]; // переменная для имени файла

int n, m;

int num;

cout << endl << "Введите имя обрабатываемого файла: ";

cin >> fileName;

// если выбран первый пункт меню - то выводим данные из файла на экран

if (sl == '1')

{

// если файл с указанным именем не существует, выводим сообщение об ошибке

ifstream inF(fileName, ios::in|ios::nocreate);

if (!inF)

{

cout << endl << "Невозможно открыть файл";

exit (1);

}

// считываем размерность массива

inF >> n;

inF >> m;

// считываем элементы массива из файла и выводим их сразу на экран

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

inF >> num;

cout << setw(6) << num;

}

cout << endl;

}

inF.close();

}

// если выбран второй пункт меню - то запрашиваем у пользователя

// данные и выводим их в файл

else

{

// открываем файл для записи, если файл с указанным именем не существует,

// то программа создает его

ofstream outF(fileName, ios::out);

if (!outF)

{

cout << endl << "Невозможно открыть файл";

exit (1);

}

// запрашиваем размерность матрицы и записываем данные в файл

cout << "Введите n, m: ";

cin >> n >> m;

outF << n << ' ' << m << endl;

cout << "Введите элементы матрицы: " << endl;

// запрашиваем элементы массива и записываем их в файл

for (int i = 0; i < n; i++)

{

for(int j=0; j < m; j++)

{

cout << "A[" << i << "][" << j << "]= ";

cin >> num;

outF << num << " ";

}

outF << endl;

}

outF.close();

}

}

Практический пример: перекодировка файла.

Любая теория должна быть востребована практикой. Вашему вниманию предлагается практический пример использования файлов, а именно, перевод файла из кодировок DOS, Koi8 в кодировку WIN. Как всегда, обращайте особое внимание на комментарии.

#include <fstream.h>

void main()

{

fstream f1,f2; // Файловые объекты

char s1[80], s2[80]; // Пути к файлам

cout << "Input filename to read:\n";

cin.getline(s1, 80); // Запрос имени входного файла

cout << "Input filename to write:\n";

cin.getline(s2, 80); // Запрос имени выходного файла

f1.open(s1, ios::in); // Открытие файла на чтение

f2.open(s2, ios::out); // Открытие файла на запись

f1.seekp(0, ios::end); // Файловый указатель перемещается

// в конец файла

int size = f1.tellp(); // Вычисление размера файла

f1.seekp(0, ios::beg); // Возврат файлового указателя

// в начало файла

unsigned char koi8[] = // Таблица кодировки KOI8-R

{0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,

0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,

0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,

0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};

unsigned char *buffer;

unsigned char temp;

buffer = new unsigned char[size]; // Создание буфера

f1.read(buffer, size); // Чтение файла в буфер

cout << "1. Dos To Win\n"

<< "2 Koi8 To Win\n";

int n;

cout << "\nInput your choice\n";

cin >> n;

// Выбор направление перекодировки

if(n == 1) { // Dos to Win

for(long i = 0; i < size; i++) {

temp = buffer[i];

if(temp == 0xA)

size--;

if(temp >= 0x80 && temp <= 0xAF)

buffer[i] = temp + 0x40;

else if(temp >= 0xE0 && temp <= 0xEF)

buffer[i] = temp + 0x10;

else if(temp == 0xF0)

buffer[i] = 0xA8;

else if(temp == 0xF1)

buffer[i] = 0xB8;

else if(temp == 0xFC)

buffer[i] = 0xB9;

}

}

else if(n == 2) { // Koi8 to Win

for(long i = 0; i < size; i++) {

temp = buffer[i];

if(temp == 0xA)

size--;

if(temp >= 0xC0 && temp <= 0xDF)

buffer[i] = koi8[temp - 0xC0] + 0x20;

else if(temp >= 0xE0 && temp <= 0xFF)

buffer[i] = koi8[temp - 0xE0];

}

}

// Запись перекодированного буфера в файл

f2.write(buffer, size);

delete [] buffer; //Удаление буфера

f1.close(); //Закрытие входного файла

f2.close(); //Закрытие выходного файла

}

В Вашей папке program есть три текстовых документа во всех кодировках. Можете эксперементировать на них.