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

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

Войти
Регистрация
Восстановить пароль
 
ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
#1

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

10.10.2012, 20:08. Просмотров 618. Ответов 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
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++):

Помогите найти ошибку в программе: не правильно выводит время в структуре TRAIN - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstring&gt; using namespace std; struct TRAIN { char station; int number; ...

Найти ошибку в программе постфиксной записи - C++
В постфиксной записи (или обратной польской записи) операция записывается после двух операндов. Например, сумма двух чисел A и B...

Не могу найти ошибку в программе - C++
Даны действительные числа х1, у1, х2, у2, …,х10, у10. Найти периметр десятиугольника, вершины которого имеют соответственно координаты (х1,...

не могу найти ошибку в программе - C++
задача Дана символьная строка. Подсчитать количество букв k в последнем ее слове считает только буквы К в первом слове и выдаёт...

Не могу найти ошибку в программе - C++
Разложение числа на сумму двух квадратов &quot;for(a=o;a&lt;=floor(sqrt(W));x++); for(b=0;b&lt;=floor(sqrt(w));y++); if(a*a+b*b==W) ...

Не могу найти ошибку в программе - C++
Прога рабочая, но если вводишь х = 0 и у= 0 то она зацикливается на &quot;Ошибка! Начните заново.&quot; и не работает правильно. Хотя должна....

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

Как я понимаю - это добавляет пробел к слову-запросу, типа - коррекция ошибки ввода пользователем.
Я пробовал закомментировать эту строку - сразу куча ошибок при компилляции.
"Имеется пробел после фамилии - это коммент из методички, я забыл его поправить.
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
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 22:07  [ТС] #5
Спасибо за подсказку, сейчас попробую.
ПО поводу разных операторов вывода, то это такая методика обучения в методичке странная - в одних лабах - printf , в других - cout<< , в третьих - puts, как я понимаю - это они постепенно показывают что есть разные способы ввода-вывода и как его применять...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2012, 22:07
Привет! Вот еще темы с ответами:

Не могу найти ошибку в программе - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cctype&gt; #define is_delim(c) (std::isspace((c)) || std::ispunct((c))) using...

Не могу найти ошибку в программе - C++
Не могу найти ошибку в программе #include &quot;stdafx.h&quot; #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include &lt;fstream.h&gt; #include...

Не могу найти ошибку в программе - C++
Здравствуйте! Не могу понять, как полностью отладить программу. Определенное понимание о характере ошибке есть( ниже прложил ее название),...

Не могу найти ошибку в программе - C++
Добрый вечер, уважаемые программисты. Прошу у вас помощи с программой. Нужно её сдавать, а она не работает. Буду очень благодарен за любую...


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

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

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