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

Поиск записи в структуре - не могу найти ошибку в написанной программе - C++

Восстановить пароль Регистрация
 
ekost
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 20:08     Поиск записи в структуре - не могу найти ошибку в написанной программе #1
Делаю лабораторную - там нужно создать некое подобие базы данных с использованием структур.
Одно из заданий - реализовать функцию вывода информации о товаре после запроса названия товара.
Программу я написал по методичке, все работает кроме самого поиска.
Что не введу - оно не находит ничего, пишет, что товар не найден.
Подскажите пожалуйста для чайника - в чем моя ошибка?
вот сам код.
Не работает самая последняя функция в коде.
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//Лаба 7 - структуры
# include <stdio.h>
# include <string.h>
# include <conio.h>
# include <iostream.h>
 
//-----------------------Константы и структуры--------------
const int len_name=20; // Длина текстовой строки в структуре
 
struct price {
        char tovar[len_name];  // Название товара
        char magaz[len_name]; //  Название магазина
        float cena; // Цена товара
};
const int size_p=sizeof(price); // 
 
//----------------------- Прототипы функций-----------------
 
int create_file (FILE *fbin);
int sort_file (FILE *fbin);
int print_file(FILE *fbin);
int search_tovar (FILE *fbin);
 
//-----------------------Основная программа------------------
 
int main() {
    FILE *fbin;
    char c;
 
    fbin=fopen("price.dat", "r+b"); // Открытие файла
    
    if (!fbin) {
          fbin = fopen("price.dat", "w+b"); // Создание нового файла
          
              if (!fbin) {
              puts("Ошибка открытия файла с данными\n");
              return 1;
          }
     }
     
     //Вывод меню и запуск необходимой функции
     
     while (1) {
          clrscr();
          puts("1. Добавление информации в файл"); 
          puts("2. Сортировка файла по алфавиту"); 
          puts("3. Вывод информации из файла");
          puts("4. Поиск товара по названию"); 
          puts("5. Выход из программы"); 
          puts("_______________________________________");  
          puts("Введите номер пункта меню"); 
          
          c=getch();
          switch (c) {
          case '1': create_file(fbin); break;
          case '2': sort_file(fbin); break;
          case '3': print_file(fbin); break;
          case '4': search_tovar(fbin); break;
          case '5': return 0;
          }
      }
}
//---------------------Запись в файл----------------------
int create_file(FILE *fbin){
 
    price elem;
    fseek(fbin, 0 , SEEK_END); // Указатель в конец файла
    puts ("Ввод данных о товаре\n");
    puts ("Для выхода введите символ *");
    puts("_______________________________________________________");
    
    while (1) {
          puts("Введите название товара");
          cin.getline (elem.tovar, len_name); // Ввод названия товара
          if (!strcmp (elem.tovar, "*")) // Если введена звездочка
              return 1;
          puts ("Введите название магазина"); 
          cin.getline (elem.magaz, len_name); // название магазина
          puts("Введите стоимость товара в гривнах");
          scanf ("%f",&elem.cena); // Цена товара
          fwrite(&elem, size_p, 1, fbin); // запись в файл
     }
}
          
//---------------------Вывод файла-----------------
int print_file(FILE *fbin){
    price elem;
    int n;
    clrscr();
    rewind (fbin); // Указатель в начало файла
    puts("Товар               Магазин             Стоимость"); // шапка таблицы
    puts("___________________________________________________");
    do{
        n=fread(&elem, size_p, 1, fbin); //чтение структуры из файла
        if (n<1) break; // Определение конца файла
        printf("%-20s%-20s%-8.2f\n", elem.tovar, elem.magaz, elem.cena);
    } while (1);
    puts("___________________________________________________");
    puts("Нажмите любую клавишу для выхода");
    getch();
    return 0;
}
 
//----------------------Сортировка записей в файле--------------------------
int sort_file (FILE *fbin) {
    long i,j;
    price elem1, elem2;
    
    puts ("Для сортировки нажмите любую клавишу");
    getch();
    fseek(fbin, 0, SEEK_END); // указатель в конец
    long len = ftell(fbin)/size_p; // Определяем длину файла
    rewind (fbin); // указатель в начало
    
    // пузырьковая сортировка
    for (i=len-1; i>=1; i--)
        for (j=0; j<=i-1; j++) {
            fseek(fbin, j*size_p, SEEK_SET); //указатель на j-запись
            fread(&elem1, size_p, 1, fbin); // читаем запись j в elem
            fread(&elem2, size_p, 1, fbin);// читаем следующую запись
            if (strcmp (elem1.tovar, elem2.tovar)>=1) {
            fseek(fbin,(-2)*size_p,SEEK_CUR); // указатель на 2 позиции назад
            
            // обмен значений
            fwrite(&elem2, size_p,1,fbin); // запись elem2
            fwrite(&elem1, size_p,1,fbin); //  потом запись elem1
        }
     }
     
     puts("Для выхода нажмите любую клавишу");
     getch();
     return 0;
}
 
//--------------------Поиск товара------------ИМЕННО ЗДЕСЬ НЕ РАБОТАЕТ
int search_tovar (FILE *fbin){
    int not_found; // флаг поиска
    char s[len_name]; // Строка поиска
    int n;
    
    price elem;
    
    while (1) {
    puts ("Введите название требуемого товара или '*' для выхода");        
    cin.getline(s, len_name); // Запоминаем товар в строке S
    if (!strcmp(s, "*")) break; // выход, если нажали звездочку
    rewind (fbin); // указатель в начало файла
    not_found=1; // флаг - товар не найден
    
    do {
      n=fread(&elem, size_p, 1, fbin); // чтение записи
      if (n<1) break; // Если n < 1  - то конец файла
      if (strstr(elem.tovar, s)) // Ищем строку s  в поле tovar
       if (elem.tovar[strlen(s)]==' ') { // Имеется пробел после фамилии
        strcpy(s,elem.tovar); // Копируем tovar в s
        puts("____________________________________________");
        puts("Товар               Магазин             Стоимость"); 
        printf("%-20s%-20s%-8.2f\n", elem.tovar, elem.magaz, elem.cena);
        puts("____________________________________________");
        not_found=0; //  товар найден
        }
     } 
     while (1);
     if (not_found)
     puts ("Требуемый товар отсутствует в базе");
   }
  puts ("Для выхода нажмите любую клавишу"); 
  getch();
  return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2012, 20:08     Поиск записи в структуре - не могу найти ошибку в написанной программе
Посмотрите здесь:

C++ не могу найти ошибку в программе
C++ Не могу найти ошибку в программе
C++ не могу ошибку найти в программе
C++ Не могу найти ошибку в программе
Не могу найти ошибку в программе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2639 / 1650 / 156
Регистрация: 13.01.2012
Сообщений: 6,212
10.10.2012, 21:35     Поиск записи в структуре - не могу найти ошибку в написанной программе #2
для чего вот это
C++
1
elem.tovar[strlen(s)]==' '
?
ekost
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 21:48  [ТС]     Поиск записи в структуре - не могу найти ошибку в написанной программе #3
Цитата Сообщение от vxg Посмотреть сообщение
для чего вот это
C++
1
elem.tovar[strlen(s)]==' '
?
такой код есть в аналогичной задаче - примере в методичке, там нужно найти сотрудника и посчитать его среднюю зарплату, я из примера выкинул все подсчеты, оставив тлько поиск.

Как я понимаю - это добавляет пробел к слову-запросу, типа - коррекция ошибки ввода пользователем.
Я пробовал закомментировать эту строку - сразу куча ошибок при компилляции.
"Имеется пробел после фамилии - это коммент из методички, я забыл его поправить.
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
10.10.2012, 22:03     Поиск записи в структуре - не могу найти ошибку в написанной программе #4
Ну хочу вам сказать что данный код тут не подходит и вам стоит просто закоментить и код будет выглядеть примерно так
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
int search_tovar (FILE *fbin)
{
    int not_found; // флаг поиска
    char s[len_name]; // Строка поиска
    int n;
 
    price elem;
 
    while (1)
    {
        cout<<"Введите название требуемого товара или '*' для выхода"<<endl;  
        fflush(stdin);
        cin.getline(s, len_name); // Запоминаем товар в строке S
        if (!strcmp(s, "*")) break; // выход, если нажали звездочку
        rewind (fbin); // указатель в начало файла
        not_found=1; // флаг - товар не найден
 
        do 
        {
            n = fread(&elem, size_p, 1, fbin); // чтение записи
            if (n < 1)
            {
                break; // Если n < 1  - то конец файла
            }
            if (strstr(elem.tovar, s))
            {// Ищем строку s  в поле tovar
                //if (elem.tovar[strlen(s)]==' ') 
                //{ // Имеется пробел после фамилии
                    //strcpy(s,elem.tovar); // Копируем tovar в s
                    cout<<"____________________________________________"<<endl;
                    cout<<"Товар               Магазин             Стоимость"<<endl; 
                    printf("%-20s%-20s%-8.2f\n", elem.tovar, elem.magaz, elem.cena);
                    cout<<"____________________________________________"<<endl;
                    not_found = 0; //  товар найден
                //}
            }
        } 
        while (1);
        if (not_found)
        {
            cout<<"Требуемый товар отсутствует в базе"<<endl;
        }
    }
    cout<<"Для выхода нажмите любую клавишу"<<endl; 
    system("pause");
    return 0;
}
так же меня удивил ваш способ вывода то ли путс то принтф то син, а так же посоветую прочитать хоть немного о правильном стиле программирования ибо код трудный для чтения. К тому же чем вас cout не удовлетворяет? Далее если юзать С тогда только принтф и тд, или же С++ где есть filestream и только cout.
это не только упростит читабельность но и немножко оптимизирует программу.
ekost
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 22:07  [ТС]     Поиск записи в структуре - не могу найти ошибку в написанной программе #5
Спасибо за подсказку, сейчас попробую.
ПО поводу разных операторов вывода, то это такая методика обучения в методичке странная - в одних лабах - printf , в других - cout<< , в третьих - puts, как я понимаю - это они постепенно показывают что есть разные способы ввода-вывода и как его применять...
Yandex
Объявления
10.10.2012, 22:07     Поиск записи в структуре - не могу найти ошибку в написанной программе
Ответ Создать тему
Опции темы

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