Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include<cstring>
- #include <windows.h>
- using namespace std;
- struct DictionaryEntry {
- char englishWord[50]; // английское слово
- char russianWord[50]; // русское слово
- };
- // 2.6.1. Преобразование тестовых данных из текстового файла в двоичный файл.
- void convertTextToBinary(const string& textFilename, const string& binaryFilename) {
- ifstream infile(textFilename);
- ofstream outfile(binaryFilename, ios::binary);
- if (!infile.is_open() || !outfile.is_open()) {
- cerr << "Ошибка при открытии файлов." << endl;
- return;
- }
- string eng, rus;
- while (infile >> eng >> rus) {
- DictionaryEntry entry;
- strncpy(entry.englishWord, eng.c_str(), sizeof(entry.englishWord));
- strncpy(entry.russianWord, rus.c_str(), sizeof(entry.russianWord));
- outfile.write(reinterpret_cast<char*>(&entry), sizeof(entry));
- }
- infile.close();
- outfile.close();
- }
- // 2.6.2. Преобразование данных из двоичного файла в текстовый.
- void convertBinaryToText(const string& binaryFilename, const string& textFilename) {
- ifstream infile(binaryFilename, ios::binary);
- ofstream outfile(textFilename);
- if (!infile.is_open() || !outfile.is_open()) {
- cerr << "Ошибка при открытии файлов." << endl;
- return;
- }
- DictionaryEntry entry;
- while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
- outfile << entry.englishWord << " " << entry.russianWord << "\n";
- }
- infile.close();
- outfile.close();
- }
- // 2.6.3. Вывод всех записей двоичного файла.
- void displayAllEntries(const string& binaryFilename) {
- ifstream infile(binaryFilename, ios::binary);
- if (!infile.is_open()) {
- cerr << "Ошибка при открытии файла." << endl;
- return;
- }
- DictionaryEntry entry;
- while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
- cout << entry.englishWord << " - " << entry.russianWord << "\n";
- }
- infile.close();
- }
- // 2.6.4. Доступ к записи по её порядковому номеру в файле.
- DictionaryEntry getEntryByIndex(const string& binaryFilename, size_t index) {
- ifstream infile(binaryFilename, ios::binary);
- if (!infile.is_open()) {
- cerr << "Ошибка при открытии файла." << endl;
- }
- infile.seekg(index * sizeof(DictionaryEntry));
- DictionaryEntry entry;
- infile.read(reinterpret_cast<char*>(&entry), sizeof(entry));
- infile.close();
- return entry;
- }
- // 2.6.5. Удаление записи с заданным значением ключа.
- void deleteEntryByKey(const string& binaryFilename, const string& key) {
- ifstream infile(binaryFilename, ios::binary);
- if (!infile.is_open()) {
- cerr << "Ошибка при открытии файла." << endl;
- return;
- }
- vector<DictionaryEntry> entries;
- DictionaryEntry entry;
- while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
- entries.push_back(entry);
- }
- infile.close();
- for (size_t i = 0; i < entries.size(); ++i) {
- if (string(entries[i].englishWord) == key) {
- entries[i] = entries.back();
- entries.pop_back();
- break;
- }
- }
- ofstream outfile(binaryFilename, ios::binary);
- for (const auto& e : entries) {
- outfile.write(reinterpret_cast<const char*>(&e), sizeof(e));
- }
- outfile.close();
- }
- // 1. Сформировать список английских слов, начинающихся с указанной буквы и их русский перевод.
- void listWordsByLetter(const string& binaryFilename, char letter) {
- ifstream infile(binaryFilename, ios::binary);
- if (!infile.is_open()) {
- cerr << "Ошибка при открытии файла." << endl;
- return;
- }
- DictionaryEntry entry;
- while (infile.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
- if (entry.englishWord[0] == letter) {
- cout << entry.englishWord << " - " << entry.russianWord << "\n";
- }
- }
- infile.close();
- }
- // 2. Обновить запись, записав новый вариант русского перевода по заданному слову.
- void updateTranslation(const string& binaryFilename, const string& key, const string& newTranslation) {
- fstream file(binaryFilename, ios::binary | ios::in | ios::out);
- if (!file.is_open()) {
- cerr << "Ошибка при открытии файла." << endl;
- return;
- }
- DictionaryEntry entry;
- while (file.read(reinterpret_cast<char*>(&entry), sizeof(entry))) {
- if (string(entry.englishWord) == key) {
- strncpy(entry.russianWord, newTranslation.c_str(), sizeof(entry.russianWord));
- file.seekp(static_cast<long long>(file.tellg()) - sizeof(entry));
- file.write(reinterpret_cast<const char*>(&entry), sizeof(entry));
- break;
- }
- }
- file.close();
- }
- int main() {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- string filename;
- cout << "Введите имя двоичного файла: ";
- cin >> filename;
- while (true) {
- cout << "\n--- Меню ---\n";
- cout << "1. Преобразовать текстовый файл в двоичный\n";
- cout << "2. Преобразовать двоичный файл в текстовый\n";
- cout << "3. Показать все записи из двоичного файла\n";
- cout << "4. Доступ к записи по её порядковому номеру\n";
- cout << "5. Удалить запись по английскому слову\n";
- cout << "6. Показать слова, начинающиеся с заданной буквы\n";
- cout << "7. Обновить русский перевод для заданного слова\n";
- cout << "8. Выход\n";
- cout << "Выберите действие: ";
- int choice;
- cin >> choice;
- cin.ignore(99999, '\n'); // очистка буфера
- switch (choice) {
- case 1: {
- string textFilename;
- cout << "Введите имя текстового файла для преобразования: ";
- cin >> textFilename;
- convertTextToBinary(textFilename, filename);
- break;
- }
- case 2: {
- string textFilename;
- cout << "Введите имя текстового файла для сохранения: ";
- cin >> textFilename;
- convertBinaryToText(filename, textFilename);
- break;
- }
- case 3: {
- displayAllEntries(filename);
- break;
- }
- case 4: {
- size_t index;
- cout << "Введите порядковый номер записи: ";
- cin >> index;
- DictionaryEntry entry = getEntryByIndex(filename, index);
- cout << entry.englishWord << " - " << entry.russianWord << "\n";
- break;
- }
- case 5: {
- string key;
- cout << "Введите английское слово для удаления: ";
- cin >> key;
- deleteEntryByKey(filename, key);
- break;
- }
- case 6: {
- char letter;
- cout << "Введите букву: ";
- cin >> letter;
- listWordsByLetter(filename, letter);
- break;
- }
- case 7: {
- string key, translation;
- cout << "Введите английское слово: ";
- cin >> key;
- cout << "Введите новый русский перевод: ";
- cin >> translation;
- updateTranslation(filename, key, translation);
- break;
- }
- case 8:
- return 0;
- default:
- cout << "Неверный выбор.\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement