Программа, которая считывает имя файла, открывает его и подсчитывает количество скобок каждого вида, содержащихся в файле.
Программа иллюстрирует чтение данных из файла посимвольно.
#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;
}