Skip to content

Instantly share code, notes, and snippets.

@sampletext32
Last active May 25, 2020 18:12
Show Gist options
  • Save sampletext32/01ee15b3ad84268ab6bbd9591ca7e734 to your computer and use it in GitHub Desktop.
Save sampletext32/01ee15b3ad84268ab6bbd9591ca7e734 to your computer and use it in GitHub Desktop.
// getdor2.cpp: главный файл проекта.
/*Пример работы с файлами. Использует стандартные функции С++ для работы с текстовым файлом
Программа позволяет дополнить описанную в программе таблицу дорог либо из файла либо с клавиатуры.
После этого находит в таблице заданную мнемокодом дорогу.
*/
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;
#define NDOR 58
//Объявление используемых функций
void AsciiRus(char s[]); //перекодировка русских букв из ASCII 866 в 1251
void savedor(); //сохранить таблицу дорог в файле
void vvoddor(); //ввод доп.дорог с сохранением их в файле
int finddor(char*); //поиск дороги по мнемокоду
//Глобальные переменные
int idor = 55;
typedef char Strng[30];
Strng dortabl[NDOR][2] = {
{"АЗЕРБАЙДЖАНСКАЯ", "Азерб."},
{"АМУРСКАЯ", "Амур."},
{"АШХАБАДСКАЯ", "Ашх."},
{"БЕЛОРУССКАЯ", "Бел."},
{"БРЕСТ-ЛИТОВСКАЯ", "Бр.-Лит."},
{"ВИННИЦКАЯ", "Вин."},
{"ВОСТ.-СИБИРСКАЯ", "В.-Сиб."},
{"ГОРЬКОВСКАЯ", "Горьк."},
{"ДАЛЬНЕВОСТОЧНАЯ", "Д.-Вост."},
{"ЗАБАЙКАЛЬСКАЯ", "Заб."},
{"ЗАКАВКАЗСКАЯ", "Закав."},
{"ЗАПАДНАЯ", "Зап."},
{"им. В. В. КУЙБЫШЕВА", "Кбш."},
{"КАЗАНСКАЯ", "Каз."},
{"КАЛИНИНСКАЯ", "Калин."},
{"КАРАГАНДИНСКАЯ", "Караг."},
{"КИРОВСКАЯ", "Кир."},
{"КИШИНЕВСКАЯ", "Кишин."},
{"КОВЕЛЬСКАЯ", "Ков."},
{"КРАСНОЯРСКАЯ", "Красн."},
{"ЛАТВИЙСКАЯ", "Латв."},
{"ЛЕНИНГРАДСКАЯ", "Лен."},
{"ЛИТОВСКАЯ", "Лит."},
{"ЛЬВОВСКАЯ", "Львов."},
{"МОСКОВСКО-ДОНБАССКАЯ", "М.-Донб."},
{"МОСКОВСКО-КИЕВСКАЯ", "М.-Киев."},
{"МОСКОВСКО-КИЕВСКАЯ", "М.-Киев."},
{"МОСКОВСКО-КУРСКАЯ", "М.-Кур."},
{"МОСКОВСКО-РЯЗАНСКАЯ", "М.-Ряз."},
{"ОДЕССКАЯ", "Одес."},
{"ОКТЯБРЬСКАЯ", "Окт."},
{"ОМСКАЯ", "Омск."},
{"ОРДЖОНИКИДЗЕВСКАЯ", "Ордж."},
{"ОРЕНБУРГСКАЯ", "Оренб."},
{"ПЕРМСКАЯ", "Перм."},
{"ПЕЧОРСКАЯ", "Печор."},
{"ПРИМОРСКАЯ", "Примор."},
{"РЯЗАНО-УРАЛЬСКАЯ", "Р.-Ур."},
{"СВЕРДЛОВСКАЯ", "Сверд."},
{"СЕВЕРНАЯ", "Сев."},
{"СЕВЕРО-ДОНЕЦКАЯ", "С.-Дон."},
{"СЕВЕРО-КАВКАЗСКАЯ", "С.-Кав."},
{"СТАЛИНГРАДСКАЯ", "Сталгр."},
{"СТАЛИНСКАЯ", "Стал."},
{"ТАШКЕНТСКАЯ", "Таш."},
{"ТОМСКАЯ", "Том."},
{"ТУРКЕСТАНО-СИБИРСКАЯ", "Т.-Сиб."},
{"ЭСТОНСКАЯ", "Эст."},
{"ЮГО-ВОСТОЧНАЯ", "Ю.-Вост."},
{"ЮГО-ЗАПАДНАЯ", "Ю.-Зап."},
{"ЮЖНАЯ", "Южн."},
{"ЮГО-ДОНЕЦКАЯ", "Ю.-Дон."},
{"ЮЖНО-УРАЛЬСКАЯ", "Ю.-УР."},
{"ЯРОСЛАВСКАЯ", "Яросл."},
{"ЮЖНО-САХАЛИНСКАЯ", "Ю.-Сах."}
};
char stroka[80];
char* pchar;
char* pc;
char stab = '\t';
int main()
{
setlocale(LC_ALL, "Russian");
ifstream inFile; //FILE * pf1; //указатель на входной (с допонительными дорогами) файл
inFile.open("dor48d.txt"); //f1=fopen("dor48d.txt","r"); //открыть входной файл для чтения
if (!inFile) //(pf1==NULL)
{
cout << "Ошибка открытия файла для чтения с именем dor48d.txt\n";
vvoddor(); //ввод доп.дорог
}
else
{
//дозагрузить таблицу дорог (читаем построчно до символа \n не более 80 символов
inFile.getline(stroka, 80, '\n'); //inFile>>stroka;//pc=fgets(stroka,79,pf1);
while (strlen(stroka) > 0 && !inFile.eof() && idor < NDOR) //(! feof(pf1))
{
stroka[strlen(stroka)] = '\0';
cout << idor << ":" << stroka << "*" << strlen(stroka) << "\n";
if (idor < NDOR)
{
/*добавление дорог */
//Выделяем поля namedor и mnkod
pchar = strchr(stroka, stab);
if (pchar == NULL)
{
strcpy_s(dortabl[idor][0], stroka);
dortabl[idor][1][0] = '\0';
}
else
{
*pchar = '\0';
strcpy_s(dortabl[idor][0], stroka);
strcpy_s(dortabl[idor][1], pchar + 1);
}
idor = idor + 1;
}
//
inFile.getline(stroka, 80, '\n'); //inFile>>stroka;//pc=fgets(stroka,79,pf1);
}
inFile.close(); //fclose(pf1); //закрыть входной файл дорог
}
//печать таблицы дорог, вместе с длинами полных и сокращенных наименований
cout << "idor=" << idor << "\n";
for (int ii = 0; ii < idor; ii++)
cout << ii << "\t" << dortabl[ii][0] << "\t" << strlen(dortabl[ii][0]) << "\t" << dortabl[ii][1] << "\t" <<
strlen(dortabl[ii][1]) << "\n";
//system("pause");
savedor(); //Делаем копию таблицы дорог в файле
cout << "Input Mnkod: ";
char indor[100];
gets_s(indor);
cout << "mnkod866=" << indor << "\n";
AsciiRus(indor); //перекодировать введенную строку из 886 в 1251
cout << "mnkod1251=" << indor << "\n";
int kd = finddor(indor);
cout << "kd=" << kd << "\n";
if (kd >= 0) cout << "name=" << dortabl[kd][0] << "\n";
system("PAUSE");
return 0;
}
int finddor(char* pstr)
{
int n = -1;
for (int i = 0; i < NDOR; i++)
{
//cout<<pstr<<"\t"<<dortabl[i][1]<<"\n";
if (strcmp(pstr, dortabl[i][1]) == 0)
{
n = i;
break;
}
}
return n;
}
void AsciiRus(char s[]) //перекодировка русских букв из ASCII 866 в 1251
{
int i = 0, k;
do
{
k = (int)s[i];
if (k < 0)
{
k = k + 256;
if (k >= 128 && k <= 175) k = k + 64; //А .... Я а ... п
else if (k >= 224 && k <= 239) k = k + 16; //р ... я
else if (k == 240) k = k - 72; //k=168; Ё
else
if (k == 241) k = k - 57; //k=184; ё
s[i] = (char)k;
}
i++;
}
while (s[i] != '\0');
}
void savedor() //Делаем копию таблицы дорог в файле
{
ofstream outFile; //FILE * pf2;
outFile.open("dor48new.txt"); //pf2=fopen("dor48new.txt","w"); //открыть выходной файл для записи
if (!outFile) //(pf2==NULL)
{
cout << "Ошибка открытия файла для чтения с именем dor48new.txt\n";
system("pause");
return;
}
else
{
for (int ii = 0; ii < idor; ii++)
{
strcpy_s(stroka, dortabl[ii][0]);
outFile << stroka << "\t"; //fputs(stroka,pf2);fputs("\t",pf2);
strcpy_s(stroka, dortabl[ii][1]);
outFile << stroka << "\n"; //fputs(stroka,pf2); fputs("\n",pf2);
}
outFile.close(); //fclose(pf2); //закрыть выходной файл дорог
}
}
void vvoddor() //ввод дополнительных дорог в таблицу с сохранением в файле
{
ofstream outFile; //FILE * pf2;
outFile.open("dor48d.txt"); //pf2=fopen("dor48d.txt","w"); //открыть выходной файл для записи
if (!outFile) //(pf2==NULL)
cout << "Ошибка открытия файла для записи с именем dor48d.txt\n";
else
{
cout << "Вводите полное и сокращенное имя доп. дорог через символ табуляции\n";
strcpy_s(stroka, " "); //инициализация буфера ввода
gets_s(stroka); //ввести первую строку
while (strlen(stroka) > 0 && idor < NDOR) //цикл пока не пустая строка
{
AsciiRus(stroka);
outFile << stroka << "\n"; //fputs(stroka,pf2); fputs("\n",pf2);
gets_s(stroka); //ввести следующую строку
idor++;
}
outFile.close(); //fclose(pf2); //закрыть выходной файл дополниттельных дорог
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment