Программа ищет в двух текстовых файлах одинаковые слова и записывает их в третий - 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);
}

Объяснение кода листинга программы

В данном коде реализована программа для поиска одинаковых слов в двух текстовых файлах и записи их в третий файл.

  1. Структура NODE:
    • typedef struct NODE {
      • char * word;
      • struct NODE * left;
      • struct NODE * right; } node_t;
  2. Функция add_node:
    • Добавляет новый узел в дерево.
    • Если дерево пустое, то создается новый узел.
    • Если слово уже есть в дереве, то функция рекурсивно вызывает себя для поиска подходящего места для добавления нового узла.
    • Возвращает 0 при успешном добавлении, -1 в случае ошибки (недостаточно памяти).
  3. Функция del_tree:
    • Удаляет дерево.
    • Рекурсивно вызывает себя для удаления левого и правого поддеревьев.
    • Освобождает память, выделенную для слова и самого узла.
    • Устанавливает указатель на дерево в NULL.
  4. Функция tree_from_file:
    • Создает дерево из содержимого файла.
    • Считывает файл построчно.
    • Для каждой строки разделяет ее на слова и добавляет их в дерево.
    • Если возникает ошибка (недостаточно памяти или ошибка при чтении файла), функция возвращает NULL.
  5. Функция find_word:
    • Ищет слово в дереве.
    • Если слово больше, чем слово в текущем узле, то рекурсивно вызывает себя для поиска в левом поддереве.
    • Если слово меньше, чем слово в текущем узле, то рекурсивно вызывает себя для поиска в правом поддереве.
    • Если слова равны, то возвращает узел.
  6. Функция dump_same:
    • Выводит слова, которые есть и в первом, и во втором дереве.
    • Рекурсивно вызывает себя для поиска одинаковых слов в поддеревьях.
    • Если слово найдено в обоих деревьях, то выводит его.
  7. Основная функция main:
    • Проверяет корректность ввода (не менее 4 аргументов).
    • Открывает входные файлы для чтения.
    • Создает и заполняет деревья из содержимого входных файлов.
    • Открывает выходной файл для записи.
    • Вызывает функцию dump_same для вывода одинаковых слов.
    • Закрывает все файлы.
    • Выводит сообщение об успешном выполнении.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы