Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31

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

10.10.2012, 20:08. Показов 1354. Ответов 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;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2012, 20:08
Ответы с готовыми решениями:

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

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

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

4
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
10.10.2012, 21:35
для чего вот это
C++
1
elem.tovar[strlen(s)]==' '
?
0
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 21:48  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
для чего вот это
C++
1
elem.tovar[strlen(s)]==' '
?
такой код есть в аналогичной задаче - примере в методичке, там нужно найти сотрудника и посчитать его среднюю зарплату, я из примера выкинул все подсчеты, оставив тлько поиск.

Как я понимаю - это добавляет пробел к слову-запросу, типа - коррекция ошибки ввода пользователем.
Я пробовал закомментировать эту строку - сразу куча ошибок при компилляции.
"Имеется пробел после фамилии - это коммент из методички, я забыл его поправить.
0
 Аватар для dederkay
46 / 46 / 4
Регистрация: 08.12.2010
Сообщений: 161
10.10.2012, 22:03
Ну хочу вам сказать что данный код тут не подходит и вам стоит просто закоментить и код будет выглядеть примерно так
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.
это не только упростит читабельность но и немножко оптимизирует программу.
1
 Аватар для ekost
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 31
10.10.2012, 22:07  [ТС]
Спасибо за подсказку, сейчас попробую.
ПО поводу разных операторов вывода, то это такая методика обучения в методичке странная - в одних лабах - printf , в других - cout<< , в третьих - puts, как я понимаю - это они постепенно показывают что есть разные способы ввода-вывода и как его применять...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2012, 22:07
Помогаю со студенческими работами здесь

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

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

Не могу найти ошибку в программе
Разложение числа на сумму двух квадратов &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) ...

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru