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

Словарь - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
23.11.2010, 10:51     Словарь #1
Мой файл данных (dict.txt) имеет вид "en_word=ru_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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
 
int main()
{
   char word[50];
   char str[100];
   char *buf1 = NULL;
   char *buf2 = NULL;
   bool find = false;
   setlocale(LC_ALL,"Russian");
   FILE *fp;
 
   if ((fp = fopen("dict.txt","r"))==NULL) {
   printf("Ошибка при открытии файла.\n");
   exit(1);
   }
 
 
   printf("Словарная база успешно открыта \n");
   printf("Введите слово для перевода \n");
   scanf("%s", &word);
   while (!feof(fp)) 
   {
       buf1 = strtok(str, "=");
       buf2 = strtok(NULL, " ");
 
       if (*buf1 == *word)
       {
           printf (word, " = " , buf2);
           find = true;
           break;
       }
      
       if (*buf2 == *word)
       {
           printf (word, " = " , buf1);
           find = true;
           break;
       }
 
   }
   if (!find)
   {
      printf ("Совпадений не найдено\n");
   }
 
   fclose(fp);
   return 0;
}
но программа слетает, помогите исправить, чтобы нормально работала)

Добавлено через 11 часов 33 минуты
народ ну подскажите, пожалуйста)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2010, 10:51     Словарь
Посмотрите здесь:

Запись в словарь! C++
Программа «Словарь». C++
C++ Интеллектуальный словарь на C++
C++ словарь t9
Частотный словарь. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.11.2010, 11:04     Словарь #2
C++
1
2
        if (*buf1 == *word) { /* здесь имеется в виду strcmp(buf1, word) == 0 ? */
            printf (word, " = " , buf2); /* printf("%s = %s" "\n", word, buf2); */
Добавлено через 1 минуту
как насчёт считывания из файла чего-нибудь ?
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
23.11.2010, 15:16  [ТС]     Словарь #3
Была идея в строку (str) записать какоето кол-во символов, потом функцией strtok разбивать эту строку, но я не знаю как это реализовать) знаю на С++ это выглядело примерно так: getline(str, 100); а как это можно записать на С?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.11.2010, 17:19     Словарь #4
C
1
fgets(str, sizeof str, ifp);
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
23.11.2010, 19:18  [ТС]     Словарь #5
спасибо) теперь всё работает)
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
24.11.2010, 01:18  [ТС]     Словарь #6
код исправил:
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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
 
 
int main()
{
   char word[100];
   char str[100];
   char *buf1 = NULL;
   char *buf2 = NULL;
   bool find = false;
   setlocale(LC_ALL,"Russian");
   FILE *fp;
 
   if ((fp = fopen("dict.txt","r"))==NULL) {
   printf("Ошибка при открытии файла.\n");
   exit(1);
   }
 
 
   printf("Словарная база успешно открыта \n");
   printf("Введите слово для перевода \n");
   scanf("%s", &word);
 
   while (!feof(fp)) 
   {
       fgets(str, sizeof str, fp);
       buf1 = strtok(str, "=");
       buf2 = strtok(NULL, " ");
 
       if (*buf1 == *word)
           {
            printf("%s = %s" "\n", word, buf2);
            find = true;
            break;
           }
      
       if (*buf2 == *word)
       {
           printf("%s = %s" "\n", word, buf1);
           find = true;
           break;
       }
 
   }
   if (!find)
   {
      printf ("Совпадений не найдено\n");
   }
    
   fclose(fp);
   getch();
   return 0;
}
но обнаружилась новая проблема) такое ощущение что он сравнивает по первой букве) т.е. допустим у меня в файле записано:
people= человек
и потом я вожу любое слово на букву p, он мне его переводит как человек) как сделать чтобы он писал "Совпадений не найдено" или переводил нормально)
Миниатюры
Словарь   Словарь  
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.11.2010, 01:35     Словарь #7
Цитата Сообщение от Sxronjke
но обнаружилась новая проблема) такое ощущение что он сравнивает по первой букве)
там сверху написано в комментариях
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
29.11.2010, 23:32  [ТС]     Словарь #8
Ещё такой вопрос, если слова в файле не найдено, мне надо написать функцию добавления слова в файл) решил сделать с помощью структуры, но у меня получается цикл бесконечный и всё время запрашивает слово и перевод и в файл ничего не записывает) подскажите как правильно сделать?
вот мой вариант:
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
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
 
struct word1
{
char eng[50];
char rus[50];
} New;
 
 
int main()
{
   char word[100];
   char str[100];
   char *buf1 = NULL;
   char *buf2 = NULL;
   bool find = false;
   char c = 'y';
   setlocale(LC_ALL,"Russian");
   FILE *fp;
 
   if ((fp = fopen("dict.txt","r"))==NULL) {
   printf("Ошибка при открытии файла.\n");
   exit(1);
   }
 
 
   printf("Словарная база успешно открыта \n");
   printf("Введите слово для перевода \n");
   scanf("%s", &word);
 
   while (!feof(fp)) 
   {
       fgets(str, 100, fp);
       buf1 = strtok(str, "=");
       buf2 = strtok(NULL, " ");
 
       if (strcmp(buf1, word) == 0)
           {
            printf("%s = %s" "\n", word, buf2);
            find = true;
            break;
           }
      
       if (strcmp(buf2, word) == 0)
       {
           printf("%s = %s" "\n", word, buf1);
           find = true;
           break;
       }
 
   }
   if (!find)
   {
      printf ("Совпадений не найдено\n");
   }
 
      while ( c == 'y' )
        {
                printf("Введите слово :");
                scanf( "%s", New.eng );
 
                printf("Перевод :");
                scanf( "%s%*c", New.rus);          
 
                fprintf( fp, "%s=%s\n", New.eng, New.rus);
                        
        }
    
   fclose(fp);
   getch();
   return 0;
}
Добавлено через 2 часа 53 минуты
народ, ну подскажите пожалуйста
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.11.2010, 02:02     Словарь #9
наверное файл надо открыть для записи
только смотри, чтобы ничего не стёрлось!

Добавлено через 45 секунд
C++
1
2
3
while (!feof(fp)) 
   {
           fgets(str, 100, fp);
C++
1
    while (fgets(str, sizeof str, fp) != NULL) {
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
30.11.2010, 17:38  [ТС]     Словарь #10
Переделал немного, сделал вот так:
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
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
 
 
int main()
{
   char word[100];
   char str[100];
   char *buf1 = NULL;
   char *buf2 = NULL;
   char eng[50];
   char rus[50];
   bool find = false;
   char c = 'y';
   setlocale(LC_ALL,"Russian");
   FILE *fp;
 
   if ((fp = fopen("dict.txt","r+"))==NULL) {
   printf("Ошибка при открытии файла.\n");
   exit(1);
   }
 
 
   printf("Словарная база успешно открыта \n");
   printf("Введите слово для перевода \n");
   scanf("%s", &word);
 
   while (fgets(str, sizeof str, fp) != NULL) {
       buf1 = strtok(str, "=");
       buf2 = strtok(NULL, " ");
 
       if (strcmp(buf1, word)==0)
           {
            printf("%s = %s" "\n", word, buf2);
            find = true;
            break;
           }
      
       if (strcmp(buf2, word)==0)
       {
           printf("%s = %s" "\n", word, buf1);
           find = true;
           break;
       }
 
   }
   if (!find)
   {
      printf ("Совпадений не найдено\n");
      fclose(fp);
   }
   
 
   fp = fopen("dict.txt", "a");
 
 
      while ( c == 'y' )
   
        {
                printf("Введите слово :");
                scanf( "%s", eng );
 
                printf("Перевод :");
                scanf( "%s%*c", rus);          
 
                fprintf( fp, "\n%s=%s", eng, rus);
         printf("Слово добавлено!");
         break;
                        
        }
    
   fclose(fp);
   getch();
   return 0;
}
такой вопрос: как мне сделать, чтобы добавление делалось, только когда у меня не было слова в файле, а когда переводилось слово, просто осуществлялся выход из программы)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.11.2010, 18:37     Словарь #11
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
while (fgets(str, sizeof str, fp) != NULL) {
       buf1 = strtok(str, "=");
       buf2 = strtok(NULL, " ");
 
       if (strcmp(buf1, word)==0)
           {
            printf("%s = %s" "\n", word, buf2);
            find = true;
            break;
           }
      
       if (strcmp(buf2, word)==0)
       {
           printf("%s = %s" "\n", word, buf1);
           find = true;
           break;
       }
 
   }
   if (!find)
   {
      printf ("Совпадений не найдено\n");
          fclose(fp);
   }
можно эту часть написать в функции
тогда в main() останется только вызов

C
1
2
    if (!word_in_dict(word, ifp))
        append_to_dict(word, trans, ofp)
Цитата Сообщение от Sxronjke
а когда переводилось слово, просто осуществлялся выход из программы
C
1
2
3
4
5
    if (found) {
        printf("Word is found." "\n");
        fclose(ifp);
        return EXIT_SUCCESS;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2010, 00:41     Словарь
Еще ссылки по теме:

C++ Словарь map
словарь C++
Словарь C++

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

Или воспользуйтесь поиском по форуму:
Sxronjke
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 54
01.12.2010, 00:41  [ТС]     Словарь #12
ладно, с этим разбирусь) подскажите ещё как можно сделать меню для этой программы? чтобы было 3 пункта: Перевод, добавление слова и выход)
Yandex
Объявления
01.12.2010, 00:41     Словарь
Ответ Создать тему
Опции темы

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