Программа ищет в двух текстовых файлах одинаковые слова и записывает их в третий - C (СИ)
Формулировка задачи:
Здравствуйте.Мне нужна помощь по преобразованию кода с++ на си.
Сам я изучаю С.Пытался сам преобразовать ничего не получилось.Программа ищет в двух текстовых файлах одинаковые слова и записывает их в третий.
Помогите пожалуйста.
#include<iostream> #include<algorithm> #include<string> #include<iterator> #include<fstream> #include<set> int main(){ std::fstream fs("1.txt"); if(!fs) { std::cerr<<"File 1.txt not found"; return 1; } std::set<std::string> set1((std::istream_iterator<std::string>(fs)), std::istream_iterator<std::string>()); fs.close(); fs.open("2.txt"); if(!fs) { std::cerr<<"File 2.txt not found"; return 1; } std::set<std::string> set2((std::istream_iterator<std::string>(fs)), std::istream_iterator<std::string>()); fs.close(); fs.open("3.txt", std::ios::out); std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::ostream_iterator<std::string>(fs, "\n")); fs.close();
Решение задачи: «Программа ищет в двух текстовых файлах одинаковые слова и записывает их в третий»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct NODE { char * word; struct NODE * left; struct NODE * right; } node_t; int add_node(node_t ** tree, const char * word) { if ( ! *tree ) { if ( ! ( *tree = malloc(sizeof(node_t)) ) ) return -1; if ( ! ( (*tree)->word = strdup(word) ) ) return -1; (*tree)->left = NULL; (*tree)->right = NULL; } else { int cmp = strcmp((*tree)->word, word); if ( cmp > 0 ) return add_node(&((*tree)->left), word); else if ( cmp < 0 ) return add_node(&((*tree)->right), word); } return 0; } void del_tree(node_t ** tree) { if ( *tree ) { del_tree(&((*tree)->left)); del_tree(&((*tree)->right)); free ((*tree)->word); free(*tree); *tree = NULL; } } node_t * tree_from_file(FILE * f, const char * delim) { char buf[BUFSIZ], * p; node_t * ret; ret = NULL; while ( fgets(buf, BUFSIZ, f) ){ for ( p = strtok(buf, delim); p; p = strtok(NULL, delim) ) { if ( add_node(&ret, p) ) { fprintf(stderr, "Can't add word to tree!\n"); del_tree(&ret); return NULL; } } } return ret; } node_t * find_word(const node_t * tree, const char * word) { if ( tree ) { int cmp = strcmp(tree->word, word); if ( cmp > 0 ) return find_word(tree->left, word); else if ( cmp < 0 ) return find_word(tree->right, word); else return (node_t*)tree; } else return NULL; } void dump_same(const node_t * a, const node_t * b, FILE * f) { if ( a ) { dump_same(a->left, b, f); if ( find_word(b, a->word) ) if ( fprintf(f, "%s\n", a->word) < 1 ) fprintf(stderr, "Can't dump to out file!\n"); dump_same(a->right, b, f); } } /**************** MAIN ******************/ #define DELIM " ,.!?/-+=\\@#$%^&*()[]{}\"'<>~`\t\n" #define APP_NAME argv[0] #define FIRST_IN argv[1] #define SECOND_IN argv[2] #define OUT argv[3] int main(int argc, char ** argv) { FILE * f; node_t * a, * b; if ( argc < 4 ) { fprintf(stderr, "USAGE: %s file1 file2 outfile ( - for sdtout )\n", APP_NAME); exit(1); } if ( ! ( f = fopen(FIRST_IN, "r") ) ) { fprintf(stderr, "%s: Can't open file %s for input!\n", APP_NAME, FIRST_IN); exit(1); } if ( ! ( a = tree_from_file(f, DELIM) ) ) { fprintf(stderr, "%s: File %s is empty or memory error occurred!", APP_NAME, FIRST_IN); if ( fclose(f) ) perror("fclose"); exit(1); } if ( fclose(f) ) { fprintf(stderr, "%s: Can't close %s opened for input!\n", APP_NAME, FIRST_IN); del_tree(&a); exit(1); } if ( ! ( f = fopen(SECOND_IN, "r") ) ) { fprintf(stderr, "%s: Can't open file %s for input!\n", APP_NAME, SECOND_IN); del_tree(&a); exit(1); } if ( ! ( b = tree_from_file(f, DELIM) ) ) { fprintf(stderr, "%s: File %s is empty or memory error occurred!", APP_NAME, SECOND_IN); if ( fclose(f) ) perror("fclose"); del_tree(&a); exit(1); } if ( fclose(f) ) { fprintf(stderr, "%s: Can't close %s opened for input!\n", APP_NAME, SECOND_IN); del_tree(&a); del_tree(&b); exit(1); } if ( strcmp(OUT, "-") == 0 ) f = stdout; else { if ( ! ( f = fopen(OUT, "w") ) ) { fprintf(stderr, "%s: Can't open %s for output!\n", APP_NAME, OUT); del_tree(&a); del_tree(&b); exit(1); } } dump_same(a, b, f); if ( ferror(f) || fclose(f) ) { fprintf(stderr, "%s: somethink is wrong with output file!\n", APP_NAME); del_tree(&a); del_tree(&b); exit(1); } del_tree(&a); del_tree(&b); fprintf(stderr, "Done.\n"); exit(0); }
Объяснение кода листинга программы
В данном коде реализована программа для поиска одинаковых слов в двух текстовых файлах и записи их в третий файл.
- Структура NODE:
- typedef struct NODE {
- char * word;
- struct NODE * left;
- struct NODE * right; } node_t;
- typedef struct NODE {
- Функция add_node:
- Добавляет новый узел в дерево.
- Если дерево пустое, то создается новый узел.
- Если слово уже есть в дереве, то функция рекурсивно вызывает себя для поиска подходящего места для добавления нового узла.
- Возвращает 0 при успешном добавлении, -1 в случае ошибки (недостаточно памяти).
- Функция del_tree:
- Удаляет дерево.
- Рекурсивно вызывает себя для удаления левого и правого поддеревьев.
- Освобождает память, выделенную для слова и самого узла.
- Устанавливает указатель на дерево в NULL.
- Функция tree_from_file:
- Создает дерево из содержимого файла.
- Считывает файл построчно.
- Для каждой строки разделяет ее на слова и добавляет их в дерево.
- Если возникает ошибка (недостаточно памяти или ошибка при чтении файла), функция возвращает NULL.
- Функция find_word:
- Ищет слово в дереве.
- Если слово больше, чем слово в текущем узле, то рекурсивно вызывает себя для поиска в левом поддереве.
- Если слово меньше, чем слово в текущем узле, то рекурсивно вызывает себя для поиска в правом поддереве.
- Если слова равны, то возвращает узел.
- Функция dump_same:
- Выводит слова, которые есть и в первом, и во втором дереве.
- Рекурсивно вызывает себя для поиска одинаковых слов в поддеревьях.
- Если слово найдено в обоих деревьях, то выводит его.
- Основная функция main:
- Проверяет корректность ввода (не менее 4 аргументов).
- Открывает входные файлы для чтения.
- Создает и заполняет деревья из содержимого входных файлов.
- Открывает выходной файл для записи.
- Вызывает функцию dump_same для вывода одинаковых слов.
- Закрывает все файлы.
- Выводит сообщение об успешном выполнении.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д