Advertisement
DaniDori

Англо-русский словарь

Oct 1st, 2023
1,012
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.74 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <fstream>
  5. #include <string>
  6. #include <vector>
  7. #include <windows.h>
  8. using namespace std;
  9.  
  10. struct DictionaryEntry {
  11.     char englishWord[50]; // английское слово
  12.     char russianWord[50];  // русское слово
  13. };
  14.  
  15. // 2.6.1. Преобразование тестовых данных из текстового файла в двоичный файл.
  16. void convertTextToBinary(const string& textFilename, const string& binaryFilename) {
  17.     ifstream infile(textFilename);
  18.     ofstream outfile(binaryFilename, ios::binary);
  19.  
  20.     if (!infile.is_open() || !outfile.is_open()) {
  21.         cerr << "Ошибка при открытии файлов." << endl;
  22.         return;
  23.     }
  24.  
  25.     string eng, rus;
  26.     //Закидываем по одному слову(англ-рус) из файла ввода в файл вывода
  27.     while (infile >> eng >> rus) {
  28.         DictionaryEntry entry;
  29.         strncpy(entry.englishWord, eng.c_str(), sizeof(entry.englishWord));
  30.         strncpy(entry.russianWord, rus.c_str(), sizeof(entry.russianWord));
  31.         // два слова пишем в файл вывода
  32.         outfile.write(reinterpret_cast<char*>(&entry), sizeof(entry));
  33.         //reinterpret_cast<char*>(&entry) - переводит тип с указателя на массив char
  34.     }
  35.  
  36.     infile.close();
  37.     outfile.close();
  38. }
  39.  
  40. // 2.6.2. Преобразование данных из двоичного файла в текстовый.
  41. void convertBinaryToText(const string& binaryFilename, const string& textFilename) {
  42.     ifstream infile(binaryFilename, ios::binary);
  43.     ofstream outfile(textFilename);
  44.  
  45.     if (!infile.is_open() || !outfile.is_open()) {
  46.         cerr << "Ошибка при открытии файлов." << endl;
  47.         return;
  48.     }
  49.  
  50.     DictionaryEntry entry;
  51.     while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
  52.         outfile << entry.englishWord << " " << entry.russianWord << "\n";
  53.     }
  54.  
  55.     infile.close();
  56.     outfile.close();
  57. }
  58.  
  59. // 2.6.3. Вывод всех записей двоичного файла.
  60. void displayAllEntries(const string& binaryFilename) {
  61.     ifstream infile(binaryFilename, ios::binary);
  62.  
  63.     if (!infile.is_open()) {
  64.         cerr << "Ошибка при открытии файла." << endl;
  65.         return;
  66.     }
  67.  
  68.     DictionaryEntry entry;
  69.     while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
  70.         cout << entry.englishWord << " - " << entry.russianWord << "\n";
  71.     }
  72.  
  73.     infile.close();
  74. }
  75.  
  76. // 2.6.4. Доступ к записи по её порядковому номеру в файле.
  77. DictionaryEntry getEntryByIndex(const string& binaryFilename, size_t index) {
  78.     ifstream infile(binaryFilename, ios::binary);
  79.  
  80.     if (!infile.is_open()) {
  81.         cerr << "Ошибка при открытии файла." << endl;
  82.     }
  83.     //перемещает указатель старта чтения на необходимое место(пропускает ненужное)
  84.     infile.seekg(index * sizeof(DictionaryEntry));
  85.     DictionaryEntry entry;
  86.     infile.read(reinterpret_cast<char*>(&entry), sizeof(entry));
  87.  
  88.     infile.close();
  89.     return entry;
  90. }
  91.  
  92. // 2.6.5. Удаление записи с заданным значением ключа.
  93. void deleteEntryByKey(const string& binaryFilename, const string& key) {
  94.     ifstream infile(binaryFilename, ios::binary);
  95.     if (!infile.is_open()) {
  96.         cerr << "Ошибка при открытии файла." << endl;
  97.         return;
  98.     }
  99.     //закидываем пары слов из файла в вектор(массив-список)
  100.     vector<DictionaryEntry> entries;
  101.     DictionaryEntry entry;
  102.     while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
  103.         entries.push_back(entry);
  104.     }
  105.  
  106.     infile.close();
  107.  
  108.     for (size_t i = 0; i < entries.size(); ++i) {
  109.         if (string(entries[i].englishWord) == key) {
  110.             //найденное слово перемещаем в конец списка
  111.             entries[i] = entries.back();
  112.             //удаляем последний элемент списка
  113.             entries.pop_back();
  114.             break;
  115.         }
  116.     }
  117.     //перезаписываем файл
  118.     ofstream outfile(binaryFilename, ios::binary);
  119.     for (const auto& e : entries) {
  120.         outfile.write(reinterpret_cast<const char*>(&e), sizeof(e));
  121.     }
  122.  
  123.     outfile.close();
  124. }
  125.  
  126. // 1. Сформировать список английских слов, начинающихся с указанной буквы и их русский перевод.
  127. void listWordsByLetter(const string& binaryFilename, char letter) {
  128.     ifstream infile(binaryFilename, ios::binary);
  129.     if (!infile.is_open()) {
  130.         cerr << "Ошибка при открытии файла." << endl;
  131.         return;
  132.     }
  133.  
  134.     DictionaryEntry entry;
  135.     while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
  136.         //если первая буква в английском слове совпала с искомой
  137.         if (entry.englishWord[0] == letter) {
  138.             cout << entry.englishWord << " - " << entry.russianWord << "\n";
  139.         }
  140.     }
  141.  
  142.     infile.close();
  143. }
  144.  
  145. // 2. Обновить запись, записав новый вариант русского перевода по заданному слову.
  146. void updateTranslation(const string& binaryFilename, const string& key, const string& newTranslation) {
  147.     fstream file(binaryFilename, ios::binary | ios::in | ios::out);
  148.     if (!file.is_open()) {
  149.         cerr << "Ошибка при открытии файла." << endl;
  150.         return;
  151.     }
  152.  
  153.     DictionaryEntry entry;
  154.     while (file.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
  155.         if (string(entry.englishWord) == key) {
  156.             //Копируем в найденную пару новое русское слово
  157.             strncpy(entry.russianWord, newTranslation.c_str(), sizeof(entry.russianWord));
  158.             //мотает курсор работы с файлом на один шаг назад
  159.             file.seekp(static_cast<long long>(file.tellg()) - sizeof(entry));
  160.             file.write(reinterpret_cast<const char*>(&entry), sizeof(entry));
  161.             break;
  162.         }
  163.     }
  164.  
  165.     file.close();
  166. }
  167.  
  168. void binaryMenu() {
  169.     string filename;
  170.     cout << "Введите имя двоичного файла: ";
  171.     cin >> filename;
  172.  
  173.     while (true) {
  174.         cout << "\n--- Меню ---\n";
  175.         cout << "1. Преобразовать текстовый файл в двоичный\n";
  176.         cout << "2. Преобразовать двоичный файл в текстовый\n";
  177.         cout << "3. Показать все записи из двоичного файла\n";
  178.         cout << "4. Доступ к записи по её порядковому номеру\n";
  179.         cout << "5. Удалить запись по английскому слову\n";
  180.         cout << "6. Показать слова, начинающиеся с заданной буквы\n";
  181.         cout << "7. Обновить русский перевод для заданного слова\n";
  182.         cout << "8. Выход\n";
  183.         cout << "Выберите действие: ";
  184.  
  185.         int choice;
  186.         cin >> choice;
  187.         cin.ignore(99999, '\n');  // очистка буфера
  188.  
  189.         switch (choice) {
  190.         case 1: {
  191.             string textFilename;
  192.             cout << "Введите имя текстового файла для преобразования: ";
  193.             cin >> textFilename;
  194.             convertTextToBinary(textFilename, filename);
  195.             cout << "успешно!\n ";
  196.             break;
  197.         }
  198.         case 2: {
  199.             string textFilename;
  200.             cout << "Введите имя текстового файла для сохранения: ";
  201.             cin >> textFilename;
  202.             convertBinaryToText(filename, textFilename);
  203.             break;
  204.         }
  205.         case 3: {
  206.             cout << "Все слова из двоичного файла: \n";
  207.             displayAllEntries(filename);
  208.             break;
  209.         }
  210.         case 4: {
  211.             size_t index;
  212.             cout << "Введите порядковый номер записи: ";
  213.             cin >> index;
  214.             DictionaryEntry entry = getEntryByIndex(filename, index);
  215.             cout << entry.englishWord << " - " << entry.russianWord << "\n";
  216.             break;
  217.         }
  218.         case 5: {
  219.             string key;
  220.             cout << "Введите английское слово для удаления: ";
  221.             cin >> key;
  222.             deleteEntryByKey(filename, key);
  223.             break;
  224.         }
  225.         case 6: {
  226.             char letter;
  227.             cout << "Введите английскую букву: ";
  228.             cin >> letter;
  229.             listWordsByLetter(filename, letter);
  230.             break;
  231.         }
  232.         case 7: {
  233.             string key, translation;
  234.             cout << "Введите английское слово: ";
  235.             cin >> key;
  236.             cout << "Введите новый русский перевод: ";
  237.             cin >> translation;
  238.             updateTranslation(filename, key, translation);
  239.             break;
  240.         }
  241.         case 8:
  242.             return;
  243.         default:
  244.             cout << "Неверный выбор.\n";
  245.         }
  246.     }
  247. }
  248.  
  249. int main() {
  250.     //Подключаем русский
  251.     SetConsoleOutputCP(1251);
  252.     SetConsoleCP(1251);
  253.     binaryMenu();
  254.     return 0;
  255. }
  256.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement