Программа ищет в двух текстовых файлах одинаковые слова и записывает их в третий - 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 для вывода одинаковых слов.
- Закрывает все файлы.
- Выводит сообщение об успешном выполнении.