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

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

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

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

23.10.2009, 15:37. Просмотров 668. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2009, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Cравнение слов в файлах. (C++):

Поиск слов в файлах - C++
Здравствуйте, у меня такая задача: в нескольких файлах (объем в совокупности от 10 до 15 гб) надо найти примерно 1000-1500 &quot;слов&quot;...

Поиск одинаковых слов в текстовых файлах - C++
помогите пожалуйста...C++ написать прогу которая 2 txt файла сравнивает на одинаковые слова и выводит их в qlistwidget или хотябы в 3...

Вывод слов на экран, которые появляются в обоих файлах в отсортированном порядке - C++
Написать программу на С++, которая считывает два имени файла с клавиатуры и выводит на экран слова, которые появляются в обоих файлах в...

Cравнение строк std::string - C++
например есть две переменные типа &quot;string&quot;: string a = &quot;HelloWorld&quot;; string b = &quot;HelloAll&quot;; Мне нужно например знать, совпадают ли...

Cравнение каких-либо не крайних чисел, полученных в результате вычисления функции - C++
Есть код и есть задача: как после цикла сделать сравнение каких-либо не крайних чисел, полученных в результате вычисления функции? ...

Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов - C++
мне нужна функция, которая во входе получает строку слов и рзделителей (&quot; &quot;, &quot;,&quot;, &quot;.&quot;, &quot;_&quot;, &quot;&quot;&quot;), а на выходе имеет массив слов из строки...

6
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.10.2009, 13:06 #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)))
        ;
0
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
26.10.2009, 10:36  [ТС] #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;
}
хэлп ми, плиз
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2009, 03:24 #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);
это когда там точка есть, но лучше, конечно, без точки сравнивать (то есть почистить слово до сравнения, прямо на этапе считывания)
0
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
27.10.2009, 10:02  [ТС] #5
спасибо большущее!! Все поняла, подправила. Только такая фишечка: если вынести за цикл открытие файла, ну и закрытие получается - программа сравнивет только первое слово из "наречия.txt". Вот такие пироги
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2009, 10:25 #6
есть rewind(FILE *)
0
Maqvaer
3 / 3 / 0
Регистрация: 23.10.2009
Сообщений: 25
27.10.2009, 11:51  [ТС] #7
работает
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2009, 11:51
Привет! Вот еще темы с ответами:

Создать список слов из файла и подсчитать количество повторения этих слов - C++
Здравствуйте. Помогите написать такую программу: в файле храниться текст. Нужно составить список слов из этого текста и посчитать частоту...

Создать список из слов. Подсчитать количество слов, совпадающих с последним словом - C++
создать список из слов. подсчитать количество слов, совпадающих с последним словом. Удалить все таки слова, оставив одно последнее.

Дана последовательность слов. Найти кол-во слов начинающихся с d и кончающихся буквой w - C++
Кто может, помогите, пожалуйста. Использование указателей при работе со строками С++ Дана непустая последовательность слов из латинских...

Вывести список слов в порядке убывания количества вхождений слов - C++
Доброго времени суток. Задание такое: вывести на стандартный выходной поток список всех различных слов в файле в порядке убывания...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
27.10.2009, 11:51
Ответ Создать тему
Опции темы

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