Advertisement
DaniDori

2.2

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