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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
jUvkeE
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 26
#1

Структурированные файлы - C++

07.03.2011, 18:26. Просмотров 1281. Ответов 11
Метки нет (Все метки)

Как сделать,чтобы во всех полях которые у меня объявлены как int в самих функциях при вводе букв она у меня обратно возвращала в меню и программа не подвисала,и я мог заново один из пунктов меню.
Сколько не пробывал все время программа возвращает в меню,но там я ничего выбрать уже не могу.
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#include<iostream>
#include <fstream>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <iomanip>
#include <dos.h>
#include <io.h>
 
using namespace std;
FILE *fl;
struct noutbook
{ int KOD;
  char FIR[10];
  char MOD[10];
  int KOL;
  int ST;
  int GAR;
};
noutbook a[30];
int str=0;
char name[20];
 
int menu();  //Меню
void newf();  //Создание и запись в файл  
void openf();  //Открыть файл
void resc();  //Вывести результат на экран
void resf();  //Вывести результат в файл
void udalenie();
void poiskst();
 
 
int main()
{
    while(true)
{
    switch(menu())
    {
                  case 1:newf(); break;
                  case 2:openf(); break;
                  case 3:resc(); break;
                  case 4:resf(); break;
                  case 5:udalenie();break;
                  case 6:poiskst();break;
                  case 7:return 0;
                  default: "Не выбрана функция";
    }
cout<<endl;
puts("Для продолжения нажмите любую клавишу");
getch();
system("cls");      
}
}
int menu()
{
    cout<<"МЕНЮ:"<<endl;  
    cout<<"1.Создание файла и ввод данных в файл"<<endl;  
    cout<<"2.Считывание данных с файла на экран"<<endl;  
    cout<<"3.Поиск по модели"<<endl;  
    cout<<"4.Вывести результат в файл"<<endl;  
    cout<<"5.Удаление"<<endl; 
    cout<<"6.Стоимость товаров более введенной стоимости"<<endl; 
    cout<<"7.Выход из программы"<<endl;  
    int i;
    cin>>i;
    return i;
    
}
 
void newf() //Создание файла и ввод данных в файл
{
 cout<<"Введите имя файла"<<endl; 
 cin>>name;
     if ((fl=fopen(name,"wb"))==NULL)
     {
     cout<<"Ошибка при создании файла"<<endl;
     getch();
     }
  cout<<"Введите число ноутбуков:  ";  
  cin>>str;
  system("cls");
  for (int i=0;i<str;i++)
  {
      cout<<i+1<<".";
      cout<<"Введите код товара:  ";
      cin>>a[i].KOD; 
      cout<<"Введите фирму ноутбука:  ";
      cin>>a[i].FIR; 
      cout<<"Введите модель ноутбука:  ";
      cin>>a[i].MOD; 
      cout<<"Введите стоимость одного ноутбука:  ";
      cin>>a[i].ST; 
      cout<<"Введите количество ноутбуков:  ";
      cin>>a[i].KOL;
      cout<<"Введите продолжительность гарантии:  ";
      cin>>a[i].GAR;  
      cout<<endl;
      fprintf(fl,"%i    %s    %s    %i    %i    %i",a[i].KOD,a[i].FIR,a[i].MOD,a[i].ST,a[i].KOL,a[i].GAR);
      fprintf(fl,"\n");
  }
  cout<<"Файлы успешно записаны в файл  "<<name<<endl;;
  fclose(fl);
}
 
void openf() //Открыть файл для считывания
{
     system("cls");
     if ((fl=fopen(name,"rb"))==NULL)
     {
     cout<<"Ошибка при открытии файла"<<endl;
     getch();
     }
     else
     {
     cout<<setw(5)<<"_________________________________________________________________________"<<endl;
     cout<<setw(5)<<"| КОД ТОВАРА"<<" | "<<"ФИРМА"<<" | "<<"МОДЕЛЬ"<<" | "<<"СТОИМОСТЬ(у.е.)"<<" | "<<"КОЛ-ВО"<<" | "<<"ГАРАНТИЯ(мес.)|"<<endl;  
     cout<<setw(5)<<"|____________|_______|________|_________________|________|_______________|"<<endl;  
     for (int i=0;i<str;i++)
     {    
     fgets(name,50,fl); 
     cout<<"| "<<setw(7)<<a[i].KOD<<"    | "<<setw(4)<<a[i].FIR<<"  |"<<setw(6)<<a[i].MOD<<"  |"<<setw(11)<<a[i].ST<<"      |"<<setw(5)<<a[i].KOL<<"   |"<<setw(7)<<a[i].GAR<<"        |"<< endl;
     cout<<setw(5)<<"|____________|_______|________|_________________|________|_______________|"<<endl;  
      }}
      fclose(fl);
}
 
void resc() //Вывести результат на экран
{
     int i;
     char MOD[10];
      system("cls");
     cout<<"Введите модель ноутбука:";
     cin>>MOD;
     cout<<setw(5)<<"_________________________________________________________________________"<<endl;
     cout<<setw(5)<<"| КОД ТОВАРА"<<" | "<<"ФИРМА"<<" | "<<"МОДЕЛЬ"<<" | "<<"СТОИМОСТЬ(у.е.)"<<" | "<<"КОЛ-ВО"<<" | "<<"ГАРАНТИЯ(мес.)|"<<endl;  
     cout<<setw(5)<<"|____________|_______|________|_________________|________|_______________|"<<endl;  
     for (int i=0;i<str;i++)
     {if (!strcmp(a[i].MOD,MOD))
     { 
      cout<<"| "<<setw(7)<<a[i].KOD<<"    | "<<setw(4)<<a[i].FIR<<"  |"<<setw(6)<<a[i].MOD<<"  |"<<setw(11)<<a[i].ST<<"      |"<<setw(5)<<a[i].KOL<<"   |"<<setw(7)<<a[i].GAR<<"        |"<< endl;
      cout<<setw(5)<<"|____________|_______|________|_________________|________|_______________|"<<endl;  
     }}
}
 
 
 
 
 
void resf() //Вывести результат в файл
{
     system("cls");
     char namet[30];
     FILE *ft;
     cout<<"Введит имя файла"<<endl;
     cin>>namet;
     if ((ft=fopen(namet,"wb"))==NULL)
     {
      cout<<"Ошибка при создании файла"<<endl;      
      getch();
      }
      char s[80];
      for (int i=0;i<str;i++)
      if (a[i].KOD==2353)
      {
                           strcpy(s,a[i].FIR);
                           strcpy(s,a[i].MOD);
                           strcat(s,"\n");
                           fputs(s,ft);
      }
                           fclose(ft);
}    
void udalenie()
{
    system("cls");
    int i,c;
    cout<<"Введите строку которую хотите удалить: "<<endl;
    cin>>a[i].KOD;
    if (a[i].KOD>str) cout<<"Данная строка в БД отсутствует."<<endl;
    else
    {
        cout<<i<<".  "<<a[i-1].KOD<<a[i-1].FIR<<" "<<a[i-1].MOD<<" "<<a[i-1].KOL<<" "<<a[i-1].ST<<" "<<a[i-1].GAR<<endl;
        for (i=i;i<=str;i++)
        {
            a[i-1] = a[i];
        }
        cout<<endl<<"Stroka "<<c<<" udalena."<<endl;
        str=str-1;
    }
    return;
}          
void poiskst()         
{
     int ST;
      system("cls");
      cout<<"Стоимость товара не менее:  ";
      cin>>ST;
     cout<<setw(5)<<"_________________________________________________________________________"<<endl;
     cout<<setw(5)<<"| КОД ТОВАРА"<<" | "<<"ФИРМА"<<" | "<<"МОДЕЛЬ"<<" | "<<"СТОИМОСТЬ(у.е.)"<<" | "<<"КОЛ-ВО"<<" | "<<"ГАРАНТИЯ(мес.)|"<<endl;  
     cout<<setw(5)<<"|____________|_______|________|_________________|________|_______________|"<<endl;  
     for (int i=0;i<str;i++)
     {if (a[i].ST>ST)
     { 
      cout<<"| "<<setw(7)<<a[i].KOD<<"    | "<<setw(4)<<a[i].FIR<<"  |"<<setw(6)<<a[i].MOD<<"  |"<<setw(11)<<a[i].ST<<"      |"<<setw(5)<<a[i].KOL<<"   |"<<setw(7)<<a[i].GAR<<"        |"<< endl;
      cout<<setw(5)<<"|____________|_______|________|_________________|________|_______________|"<<endl;  
     }}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2011, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Структурированные файлы (C++):

Структурированные типы данных - C++
Даны две структуры: struct point {int x, y;} p1, p2; struct rect {struct point pt1, pt2;}; и соответствующие им структурные...

Структурированные типы данных. Массивы С++ - C++
В двумерном массиве найти суммы S отрицательных элементов каждого столбца. Добавлено через 20 минут нужны идеи ПОМОГИТЕ

Структурированные типы данных: смена записей местами - C++
В данной программе создается что-то вроде базы данных в которой записаны ФИО сотрудников, далее кто они по научной...

Создать файл и записать в него структурированные данные - C++
Помогите,пожалуйста, решить задачу: Используя ввод-вывод в стиле С создать файл и записать в него структурированные данные. Структура...

Создать файл и записать в него структурированные данные - C++
Кто знает,помогите,пожалуйста, решить задачу: Используя ввод-вывод в стиле С создать файл и записать в него структурированные данные. ...

Используя ввод-вывод в стиле С создать файл и записать в него структурированные данные - C++
Помогите очень нужна ваша помощь. Cтруктура &quot;Стадион&quot;: - название; - год постройки; - количество площадок; - виды спорта. ...

11
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
07.03.2011, 18:36 #2
попробуй так

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
int main()
{
    while(true)
{
    switch(menu())
    {
                  case 1:newf(); break;
                  case 2:openf(); break;
                  case 3:resc(); break;
                  case 4:resf(); break;
                  case 5:udalenie();break;
                  case 6:poiskst();break;
                  case 7:return 0;
                  default: "Не выбрана функция";
    }
cout<<endl;
puts("Для продолжения нажмите любую клавишу");
system("cls");      
}
}
 
int menu()
{
    cout<<"МЕНЮ:"<<endl;  
    cout<<"1.Создание файла и ввод данных в файл"<<endl;  
    cout<<"2.Считывание данных с файла на экран"<<endl;  
    cout<<"3.Поиск по модели"<<endl;  
    cout<<"4.Вывести результат в файл"<<endl;  
    cout<<"5.Удаление"<<endl; 
    cout<<"6.Стоимость товаров более введенной стоимости"<<endl; 
    cout<<"7.Выход из программы"<<endl;  
    int i;
    i = int(getch())-int('0');
    return i;
    
}
0
jUvkeE
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 26
07.03.2011, 19:11  [ТС] #3
не не проходит.
все равно подвисает.


ps мне надо чтобы при вводе в поля KOD,KOL,ST,GAR букв программа обратно возвращалась в меню и я мог работать с файлом дальше.
0
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
07.03.2011, 19:20 #4
а на каком месте подвисает? после выполнения каждой процедуры? когда меню повторно выведено? или до вывода меню?
0
jUvkeE
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 26
07.03.2011, 20:37  [ТС] #5
1.запускаю программу.меню работает.
2.выбираю допустим пункт Создание файла.>>Вызывается функция создания файла
3.Там где мне надо ввести допустим код_товара,гарантия,количество или стоимость если введу буквы в каком либо из этих полей,то программа должна вернуться обратно в меню(т.к. там допустимы только числа),и я мог заново работать с ним(как и при запуске).

Сейчас если я буду вводить вместо цифр буквы,то программа выходит в меню,но меню не работает(не вызывает функций никаких).
0
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
07.03.2011, 20:45 #6
то есть, если ты введешь цифры, то прога будет работать нормально?
0
jUvkeE
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 26
07.03.2011, 23:23  [ТС] #7
да,если я буду вводить цифры в полях с типом данных int,то функция выполняется далее,а если ввести в эти же поля буквы или символы,то программа вернется в меню(только чтобы оно не подвисало,как у меня выходит и я ничего не мог сделать,а чтобы меню работало,т.е. я мог вызывать функции как и при первом запуске.)

Я не знаю конечно,мб. есть команды которые в операторе IF могли бы проверить является ли данное число цифрой,либо каким либо символом(буквой).
0
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
07.03.2011, 23:46 #8
аа... ну естественно. Ввод данных не того типа убивает поток инпут. принимай посимвольно и обрабатывай, чтобы не вы инпут не ложился
0
jUvkeE
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 26
08.03.2011, 22:12  [ТС] #9
а как я смогу посимвольно проверить число которое которое integer при условии что я его ввожу не по отдельности а целиком сразу.Разве так возможно проверить??


кстати возник еще один вопрос.
В функции void_udalenie() как мне сделать так, чтобы я мог удалить данные по полю KOD товара???(т.е. я введу KOD товара который есть в моем файле,и он удалил эту строку.)
0
-MefistofeL-
21 / 19 / 1
Регистрация: 11.02.2009
Сообщений: 383
08.03.2011, 22:27 #10
Цитата Сообщение от jUvkeE Посмотреть сообщение
а как я смогу посимвольно проверить число которое которое integer при условии что я его ввожу не по отдельности а целиком сразу.Разве так возможно проверить??
посимвольно принимаешь, если цифра - то прибавляешь к числу и выводишь, если не цифра - пропускаешь и не выводишь. Примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int safetyReadInt()
{
     char c = 0;
     int a = 0;
     while (c != (char) 13)
     {
          c = getch();
          if ((int) c > (int) '0' && (int) c < (int) '9' )
          {
               if ( (c != 0) || ( (c ==0) && (a != 0) ) )
               {
                    a = a*10 + (int)c - (int)'0';
                    cout<<c;
               }
          }
     }
}
не проверял, отлаживай сам)
0
sfinexer
-6 / 8 / 2
Регистрация: 22.01.2011
Сообщений: 152
08.03.2011, 23:45 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
      cout<<i+1<<".";
      cout<<"Введите код товара:  ";
      cin>>a[i].KOD; 
      cout<<"Введите фирму ноутбука:  ";
      cin>>a[i].FIR; 
      cout<<"Введите модель ноутбука:  ";
      cin>>a[i].MOD; 
      cout<<"Введите стоимость одного ноутбука:  ";
      cin>>a[i].ST; 
      cout<<"Введите количество ноутбуков:  ";
      cin>>a[i].KOL;
      cout<<"Введите продолжительность гарантии:  ";
      cin>>a[i].GAR;  
      cout<<endl;
Так писать нельзя, не каждый компилятор это будет выполнять так как вам хочется.
cout загоняет запись в буфер, а потом когда ему захочется выводит, хотя борланд, и GCC работают с настройками по умолчанию корректно, а вот интеловский уже нет(
в вашем случае надо обязательно скидывать буфер на экран тоесть писать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
      cout<<i+1<<".";
      cout<<"Введите код товара:  "<<endl;
      cin>>a[i].KOD; 
      cout<<"Введите фирму ноутбука:  "<<endl;
      cin>>a[i].FIR; 
      cout<<"Введите модель ноутбука:  "<<endl;
      cin>>a[i].MOD; 
      cout<<"Введите стоимость одного ноутбука:  "<<endl;
      cin>>a[i].ST; 
      cout<<"Введите количество ноутбуков:  "<<endl;
      cin>>a[i].KOL;
      cout<<"Введите продолжительность гарантии:  "<<endl;
      cin>>a[i].GAR;  
      cout<<endl;
Если лень подписывать можно вместо cout использовать cerr, это не буферизированный вывод на экран.

Правда на он и cerr чтобы если что-то случилось сразу о этом оповестить
1
jUvkeE
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 26
10.03.2011, 18:56  [ТС] #12
не знал.очень благодарен за поправку.
0
10.03.2011, 18:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2011, 18:56
Привет! Вот еще темы с ответами:

Что такое "Структурированные типы данных. Объекты" - C++
Что такое? Структурированные типы данных. Объекты. Разобрался.

Заголовочные файлы .h, файлы исходного когда c/c++ и установление связи между ними - C++
Всем добрый вечер!) Относительно недавно стал изучать c/c++, хочу полюбопытствовать ,так как появился вопрос. Почему при объявлении...

Работа в Visual Studio 2015 - как добавить файлы исходного кода и заголовочные файлы? - C++
Приветствую всех! Столкнулся с тем, что решая задачи по книге Лафоре про графику, не смог добавить файлы .h и .cpp, скачав их с одной из...

Зачем нужно добавлять файлы в файлы исходного кода - C++
Зачем нужно добавлять файлы в файлы исходного кода (кроме main.cpp)? И как вызвать из main.cpp другой файл?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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