Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
#1

Cравнение слов в файлах. - C++

23.10.2009, 15:37. Просмотров 619. Ответов 6
Метки нет (Все метки)

Здравствуйте!
Такое дело: надо проверить наличие слова из одного txt файла("наречия.txt") в другом txt файле(словарь.txt). И, если есть, записать в третий файл ("слова_в_словаре.txt")с добавоением знака "+". Проблема заключается в том, что в файле "наречия" слова представлены в виде списка, где в каждой строке по одному слову. Например, информационност информационщик
информаш
....
А в словаре слова преставлены следующим образом:
Код
информационност 75 68 397 Фг -
информационщик 11 7 36 Фб - 22
информаш 2805 61 36 Фг - 29
информбюро 29 20 31 Фа - 8
..........
Для извлечения слов из файлов пользуюсь функцией fgets (word,' ', file_from); где значение 'пробел' НЕ ПОДХОДИТ для правильной работы программы .

Вот сам код, может там ещё "кривенько":



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
 
int main(void)
 
{
 
FILE *file_from;
FILE *file_in;
FILE *file_to;
 
char* file_words = "наречия.txt";
char* file_vocab = "словарь.txt";
char* file_word_in_vocab = "слова_в_словаре.txt";
 
 
if(!(file_from = fopen( file_words, "r+" )))//файл где слова для сверки(наречия)
{
    printf("File %s not found", file_words);
    return 0;
}
 
if(!(file_in=fopen(file_vocab,"r"))) //файл словаря
{
    printf("File %s not found", file_vocab);
    return 0;
}
 
char word_name[2256];
char word[2256];
while (!feof(file_from))
{
fgets (word,' ', file_from);
 
while(feof(file_in)==NULL)
{
 
fgets (word_name,' ', file_in);    
 
int i=0;
char temp[2256]= "";
 
while(word_name[i]!=' ')
{
    temp[i] = word_name[i];
    i++;
}
 
if (strcmp(word,temp)==0)
{
    if(!(file_to=fopen (file_word_in_vocab, "w")))//файл с результатом работы
    {
        printf("File %s not found", file_word_in_vocab);
        return 0;
    }
    fputs("+", file_to);
    fputs(word, file_to);
    fclose( file_to);
}
}
fclose(file_in);
}
 
fclose( file_from);
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2009, 15:37     Cравнение слов в файлах.
Посмотрите здесь:

В массиве слов найти пару слов, из которых одно является обращением другого C++
Построить диаграмму длины слов, входящих в текст, содержащий от 5 до 10 слов. C++
gotoxy в файлах C++
C++ Вопрос по файлах в С++
C++ Поиск одинаковых слов в текстовых файлах
Поиск слов в файлах C++
Подсчитать и вывести на экран число слов в ней, а затем и каждое отдельное слов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.10.2009, 13:06     Cравнение слов в файлах. #2
дело не в пробеле, много ошибок

например, файл результатов каждый раз перезатирается
для слова огромный буфер создаётся на каждом витке цикла (надо или меньше или вынести)
fgets принимает пробел на месте, где должен стоять размер, ну, он сработает по совпадению и будет читать по 31 символу
printf'ы без перевода строки
простой C, а юзаются заголовки iostream и fstream (в stdio.h описаны и printf, и FILE)
юзается strcmp, а заголовка string.h нет

ещё там есть, типа file_words зачем-то открывается ещё и для записи - r+

Добавлено через 5 минут
C
1
    while(feof(file_in)==NULL)
условие юзает нулевой указатель, надо число ноль
да и сделано по пхпшному

C
1
2
    while((fgets (word_name, sizeof word_name, file_in)))
        ;
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
26.10.2009, 10:36  [ТС]     Cравнение слов в файлах. #3
Спасибо огромное! Вроде все о чем писали подправила: строки сраниваются все, но к сожалению не так,как хотелось бы. Если сранивать формат слово - слово - работает иделаьно, а если слово - слово со значками - не отыскивает совпадение. То есть, в словаре слово записано например
информационност 75 68 397 Фг -
а сравнивается оно со словом информационност.И, соответственно не находится . Хотя,когда извлекаю слово из "словарь.txt" (word_name) в gets задаю размер слова из "наречия.txt", то есть слова без этих значков(word). Вот подправленный код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdio.h>
 
int main(void)
 
{
 
FILE *file_from;
FILE *file_in;
FILE *file_to;
 
char* file_words = "наречия.txt";
char* file_vocab = "словарь.txt";
char* file_word_in_vocab = "слова_в_словаре.txt";
 
 
if(!(file_from = fopen( file_words, "r" )))//файл где слова для сверки(наречия)
{
    printf("File %s not found\n", file_words);
    return 0;
}
 
if(!(file_to=fopen (file_word_in_vocab, "w")))//файл с результатом работы
    {
        printf("File %s not found\n", file_word_in_vocab);
        return 0;
    }
 
char word_name[23];
char word[23];
 
while(fgets (word,sizeof word, file_from))
{
 
if(!(file_in=fopen(file_vocab,"r"))) //файл словаря
{
    printf("File %s not found\n", file_vocab);
    return 0;
}
while(fgets (word_name,sizeof word, file_in))
 {
    
int i=0;
char temp[226]= "";
 
while(word_name[i]!=' ')
{
    temp[i] = word_name[i];
    i++;
}
 
if (strcmp(word,temp)==0)
{
    fputs("+", file_to);
    fputs(word, file_to);
    
}
}
fclose(file_in);
}
fclose( file_to);
fclose( file_from);
return 0;
}
хэлп ми, плиз
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2009, 03:24     Cравнение слов в файлах. #4
два раза stdio.h
открытие файла вынести из цикла
если файл при открытии для записи дал NULL, это значит его невозможно создать, а не найти
при ошибке программа должна возвращать не ноль, так как ноль общепринят как успех (ошибки можно нумеровать, чтобы было понятно где конкретно программа вышла)

Код
информационност 75 68 397 Фг -
информационност.
C
1
2
3
4
5
    char temp[100];
 
    sscanf(longword, "%99[^ ]", temp);
    if (!strncmp(shortword, temp, strlen(temp)))
        fprintf(file_to, "+%s" "\n", temp);
это когда там точка есть, но лучше, конечно, без точки сравнивать (то есть почистить слово до сравнения, прямо на этапе считывания)
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
27.10.2009, 10:02  [ТС]     Cравнение слов в файлах. #5
спасибо большущее!! Все поняла, подправила. Только такая фишечка: если вынести за цикл открытие файла, ну и закрытие получается - программа сравнивет только первое слово из "наречия.txt". Вот такие пироги
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2009, 10:25     Cравнение слов в файлах. #6
есть rewind(FILE *)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2009, 11:51     Cравнение слов в файлах.
Еще ссылки по теме:

Найти слова которые могут быть полностью сложены из других слов,сцепление слов(конкатенация) C++
C++ Реверс в файлах
C++ Вывод слов на экран, которые появляются в обоих файлах в отсортированном порядке
Cравнение каких-либо не крайних чисел, полученных в результате вычисления функции C++
Cравнение строк std::string C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
27.10.2009, 11:51  [ТС]     Cравнение слов в файлах. #7
работает
Yandex
Объявления
27.10.2009, 11:51     Cравнение слов в файлах.
Ответ Создать тему
Опции темы

Текущее время: 18:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru