Программа, которая считывает имя файла, открывает его и подсчитывает количество скобок каждого вида, содержащихся в файле.

Программа иллюстрирует чтение данных из файла посимвольно.

#include<iostream>

#include<windows.h>

#include<iomanip>

#include<math.h>

#include<conio.h>

#include<String.h>

#include<ctype.h>

#include <stdlib.h>

#include <fstream> // Этот файл обеспечивает работу с файлами

using namespace std;

int main()

{

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

ifstream ifl; // Объявляем файл для чтения

char ch;

char name[20]; // Имя файла

do /* Цикл, который повторяет ввод имени файла до тех пор, пока оно не будет задано правильно */

{

int i = 0; // Счетчик символов

cout<<"Задайте имя файла: ";

while ((ch = _getche()) != '\r') /* Посимвольное чтение имени позволит прервать цикл в любой момент при нажатии клавиши <Esc> (конечно, это не обязательно) */

{

if (ch == 27) exit(0);

else name[i++] = ch;

}

cout<<"\n";

name[i] = '\0';

ifl.open(name,ios::in); // пытаемся открыть файл

if(ifl==0)

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

{

cout<<"Файл не найден!\n"; ch = _getch();

if (ch==27) exit(0); /* Можно прервать программу, увидев сообщение */

}

} while (!ifl); // пока файл не открыт

if (ifl) // Если файл открыт, выполняем основные действия:

{

int val; // Символ, считываемый из файла

int count1=0; // Счетчики скобок

int count2=0;

int count3=0;

int count4=0;

int count5=0;

int count6=0;

while (!ifl.eof()) // пока не конец файла

{

val=ifl.get(); // считываем 1 символ

/* проверяем символ и, если это скобка, увеличиваем соответствующий счетчик: */

switch (val)

{

case '[': count1++; break;

case ']': count2++; break;

case '(': count3++; break;

case ')': count4++; break;

case '{': count5++; break;

case '}': count6++;

}

}

cout << "[=" << count1 << endl;

cout << "]=" << count2 << endl;

cout << "(=" << count3 << endl;

cout << ")=" << count4 << endl;

cout << "{=" << count5 << endl;

cout << "}=" << count6 << endl;

_getch();

}

return 0;

}

2. Программа, инвертирующая файл (переставляющая символы в обратном порядке)

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

#include<iostream>

#include<iomanip>

#include<math.h>

#include<conio.h>

#include<String.h>

#include<ctype.h>

#include <stdlib.h>

#include<windows.h>

#include <fstream> // Этот файл обеспечивает работу с файлами

using namespace std;

int main()

{

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

ifstream inf; // Объявляем файл для чтения

ofstream outf; // файл для записи

char ch; // символ, который будет считываться из файла

char name1[81]; // имя файла для чтения

char name2[81]; // имя файла для записи

cout<<"Введите имя файла, который нужно инвертировать: ";

cin >> name1;

inf.open(name1); // открываем файл

if ( !inf ) // если файл не открыт

cout<<"Файл не найден" ;

else

{

cout << "Введите имя фaйла, который должен получиться в результате: ";

cin >> name2;

outf.open(name2); // открываем файл для записи

inf.seekg(-1L, ios::end); /* выполняем позициони­рова­ние на последний символ файла. Первый параметр – длинное целое число, поэтому наличие суффикса L обязательно. Если мы не хотим, чтобы результирующий файл начинался с перехода на другую строку, можно использовать –3L в качестве первого параметра */

do /* повторяем нижеследующие действия до тех пор, пока не дойдем до первого символа файла */

{

inf.get(ch); // считываем символ

if (ch == '\n') inf.seekg(-1L, ios:: cur);

/* каждая строка текстового файла заканчивается двумя символами: “\r\n”, но рассматриваются они как один: ‘\n’, поэтому прочитав ‘\n’, соседний символ пропускаем */

outf << ch; // записываем его в файл

cout << ch; // выводим символ на экран

inf.seekg(-2L, ios::cur); /* делаем два шага назад (мы движемся в одном направление, а чтение выполняется в другом, поэтому смещать позицию нужно на прочитанный символ и на тот, который будет считываться */

} while ( !inf.fail() ); /* когда мы попытаемся установить позицию за началом файла, функция fail() будет давать 1 */

cout << endl; // заканчиваем вывод на экран

outf << endl; // и в файл

inf.close(); outf.close(); // закрываем оба файла

}

_getch();

return 0;

}

Наши рекомендации