Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
1

Файл: Фильтрация входных данных

22.03.2013, 00:48. Показов 4288. Ответов 60
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, случилась такая вот проблема.
Из кода можно видеть что работа с вводом данных начинается если введён номер аккаунта от 1 до 100
но проблема в том, что если ввести например букву вместо номера аккаунта то программа выдаёт непрерывный поток фраз. Моя попытка проверки вводимых данных не увенчалась успехом. Помогите кто знает.
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
void add_new()
{
     int i;
     clientData client;
     fstream fails; 
     
     fails.open("credit.dat", ios::out | ios::binary);  
     
     cout << "Enter account number (1 to 100, 0 to end input)" << endl;
     cin >> client.accNum;
     
     for(int k = 0; k < 101; k ++)
     {
             if(client.accNum != k)
             {
                              cout << "Please try agane!" << endl;
                              cout << "Enter account number (1 to 100, 0 to end input)" << endl;
                                   
                              cin >> client.accNum;
             }
                  while (client.accNum != 0)
     {
           cout << "Enter lastname, firstname, balance" << endl;
           cin >> client.Sur >> client.Name >> client.balance;
           
           fails.seekp((client.accNum-1) * sizeof(clientData), ios::beg);
           fails.write((char*)&client, sizeof(clientData));
           
           cout << "Enter account number" << endl;
           cin >> client.accNum;
     }
     
     fails.close();
     }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2013, 00:48
Ответы с готовыми решениями:

Проверка на корректность входных данных
Нужно написать программу, которая бы проверяла строку на корректность. Допустимый формат вот такой...

Ошибки (пропуски) при буферизации входных данных
Читается порт UART на микроконтроллере Atmega. Применяю типовой алгоритм, но аппаратно вижу...

Проверка входных данных: вызов и обработка исключения
Всем привет. Не могу разобраться с проверкой входных данных. Нужно чтобы если я ввел какой либо...

Не могу создать файлы входных и выходных данных
Не понимаю что неправильно в открытии и создании input.txt и output.txt В универе на линуксе не...

60
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.03.2013, 02:44 2
Только числа от 1 до 100. После числа нет других символов или пробелов (только Enter). Перед числом могут быть пробелы или знак +:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int n; 
while (true)
{
    cout << "Enter account number (1 to 100, 0 to end input)" << endl;
    cin >> n;
    if (cin && (cin.peek() == '\n') && n >= 1 && n <= 100) break;
        
    cin.clear();
    while (cin.get() != '\n');
        
    system("cls");
    cout << "Please try agane!" << endl;
}
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
22.03.2013, 15:28  [ТС] 3
И всё таки здесь ошибка, не корректно работает программа

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
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
struct clientData{
   int accNum;
   char Sur[15];
   char Name[10];
   float balance;
};
 
void add_new()
{
 
   clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::out | ios::binary);  
 
   cout << "Enter account number (1 to 100, 0 to end input)" << endl;
   cin >> client.accNum;
                            
   while (client.accNum != 0)
   {
         cout << "Enter lastname" << endl;
         cin >> client.Sur;
         cout << "Enter firstname" << endl;
         cin >> client.Name;
         cout << "Enter balance" << endl;
         cin >> client.balance;
         fails.seekp((client.accNum-1) * sizeof(clientData), ios::beg);
         fails.write((char*)&client, sizeof(clientData));
   }
   
   fails.close();
 
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.03.2013, 16:20 4
Цитата Сообщение от mster-doc Посмотреть сообщение
не корректно работает программа
В чём некорректность?

Добавлено через 3 минуты
Из цикла while() у вас программа как должна выйти?

Добавлено через 7 минут
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
void add_new()
{
   clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::out | ios::binary);  
 
   cout << "Enter account number (1 to 100, 0 to end input)" << endl;
   cin >> client.accNum;
   
   while (true)
   {
        cout << "Enter account number (1 to 100, 0 to end input)" << endl;
        cin >> client.accNum;
        if (cin && (cin.peek() == '\n') && client.accNum >= 1 && client.accNum <= 100) break;
        
        cin.clear();
        while (cin.get() != '\n');
        
        system("cls");
        cout << "Please try agane!" << endl;
   }                         
   
   char ch;
   while (true)
   {
         cout << "Enter lastname" << endl;
         cin >> client.Sur;
         cout << "Enter firstname" << endl;
         cin >> client.Name;
         cout << "Enter balance" << endl;
         cin >> client.balance;
         fails.seekp((client.accNum-1) * sizeof(clientData), ios::beg);
         fails.write((const char*)&client, sizeof(clientData));
         
         cout << "Continue? (y/n) ";
         cin >> ch;
         if (ch != 'y') break;
   }
   
   fails.close();
}
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
23.03.2013, 00:22  [ТС] 5
Здравствуйте. Подскажите кто знает почему в это строка компилятор выдаёт ошибку.
C++
1
 fails.open("credit.dat", ios::trunk | ios::binary);
Более полный отрывок кода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void delit()
{
   clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::trunk | ios::binary);  
     
   cout << "Enter account number (1 to 100)" << endl;
   cin >> client.accNum;
   
   
   fails.close();
}
Включены библиотеки #include <iostream>
#include <fstream>
#include <iomanip>

ошибка
`trunk' is not a member of `std::ios'
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 00:49 6
C++
1
ios::trunc
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
23.03.2013, 02:23  [ТС] 7
Здравствуйте. Помогите пожалуйста кто знает как подсчитать количество заполненных форм в файле?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 02:43 8
Цитата Сообщение от mster-doc Посмотреть сообщение
Здравствуйте. Помогите пожалуйста кто знает как подсчитать количество заполненных форм в файле?
Имеете ввиду, бинарно записанных структур?

Добавлено через 10 минут
И там, где объявяете структуру, сделайте хотя бы так:
C++
1
2
3
4
5
6
7
8
#pragma pack (push, 1)
struct clientData{
   int accNum;
   char Sur[15];
   char Name[10];
   float balance;
};
#pragma pack (pop)
Почему, можно здесь почитать: Использование #pragma pack(push,1)... pack(pop)
http://www.kalinin.ru/programm... 7_00.shtml
http://habrahabr.ru/post/142662/
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
23.03.2013, 21:48  [ТС] 9
Здравствуйте. Я что-то если честно не понял как выравнивание полей структуры может помочь мне с подсчётом заполненных структур. Может мы просто друг друга недопоняли, я имел в веду, что у меня есть несколько заполненных форм
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
struct clientData{
   int accNum;
   char Sur[15];
   char Name[10];
   float balance;
};
 
void add_new()
{
   clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::app | ios::out | ios::binary);  
   
   char ch; 
   while (true)
   {
         cout << "Enter account number (1 to 100)" << endl;
         cin >> client.accNum;
         
         cout << "Enter Surname" << endl;
         cin >> client.Sur;
         cout << "Enter Name" << endl;
         cin >> client.Name;
         cout << "Enter balance" << endl;
         cin >> client.balance;
         fails.seekp((client.accNum-1) * sizeof(clientData), ios::beg);
         fails.write((const char*)&client, sizeof(clientData));
         
         cout << "Continue? (y/n) ";
         cin >> ch;
         if (ch != 'y') break;
   }
   
   fails.close();
}
И мне бы хотелось бы подсчитать их количество.

Я пытался сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void c_r()
{
     clientData client;
     
    bool find = false;
    
    int i=0;
    
    for(int q = 0; q < 100; q++)
    {
            if(client.accNum !=0)
            {
                           find = true;
                           i++;
            }
    }
    cout << i;
}
но это не работает так как у меня все эти элементы не равны 0 и программа показывает, что заполнено 100 (поскольку я указал такой размер). а в реальности заполнено только 7
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 22:00 10
Цитата Сообщение от mster-doc Посмотреть сообщение
Я что-то если честно не понял как выравнивание полей структуры может помочь мне с подсчётом заполненных структур.
Я не для этого написал об этом.
Насчёт "заполненных форм" я спросил это:
Цитата Сообщение от alsav22 Посмотреть сообщение
Имеете ввиду, бинарно записанных структур?
Или что другое?

Добавлено через 6 минут
Если количество записанных структур в файле, то 1) можно вести подсчёт при записи, 2) взять размер файла и поделить на размер структуры.
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
23.03.2013, 22:19  [ТС] 11
Да бинарно.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 22:51 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma pack (push, 1)
struct clientData{
   int accNum;
   char Sur[15];
   char Name[10];
   float balance;
};
#pragma pack (pop)
...
 
ifstream fails("credit.dat", ios::binary); 
fails.seekg(0, ios::end);
int size = fails.tellg(); // size - размер файла в байтах
fails.seekg(0);
  
int n = size / sizeof(clientData); // количество структур в файле
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
23.03.2013, 23:56  [ТС] 13
Да, в бинарном.

Добавлено через 18 минут
ой случайно дважды написал

Добавлено через 31 минуту
Если так сделать, то данный превращаются в набор символов.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 00:07 14
Цитата Сообщение от mster-doc Посмотреть сообщение
Если так сделать, то данный превращаются в набор символов.
Где и что превращается?
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
24.03.2013, 00:32  [ТС] 15
Если я вставляю этот код, то при вызове функции которая показывает все записи там вместо введённых записей какие то странные цифры и буквы.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 00:48 16
Цитата Сообщение от mster-doc Посмотреть сообщение
Если я вставляю этот код
Я не вижу куда и как...

Добавлено через 7 минут
Способ из 12 поста можно использовать, если данные в файл пишутся последовательно. У вас, как я понял, запись идёт в произвольное место файла. Считайте при записи, сколько структур записали.
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
24.03.2013, 00:53  [ТС] 17
Вот это поставил в саму функцию подсчёта
C++
1
2
3
4
5
6
7
8
void c_r()
{
ifstream fails("credit.dat", ios::binary); 
fails.seekg(0, ios::end);
int size = fails.tellg();
fails.seekg(0);
  
int n = size / sizeof(clientData);}
А это в самом начале программы, что бы не писать в каждой функции отдельно
C++
1
2
3
4
5
6
7
8
#pragma pack (push, 1)
struct clientData{
   int accNum;
   char Sur[15];
   char Name[10];
   float balance;
};
#pragma pack (pop)
Но мне понравилась твоя идея сделать автоматический ввод порядкового номера аккаунта и я сделал так
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
   char ch;
   while (true)
   {
         for(int q = 1; q < 101; q++)
         {
         client.accNum = q;
         cout << "Account number is:"<< q << endl;
         
         
         cout << "Enter Surname" << endl;
         cin >> client.Sur;
         cout << "Enter Name" << endl;
         cin >> client.Name;
         cout << "Enter balance" << endl;
         cin >> client.balance;
         fails.seekp((client.accNum-1) * sizeof(clientData), ios::beg);
         fails.write((const char*)&client, sizeof(clientData));
         
         cout << "Continue? (y/n) ";
         cin >> ch;
         if (ch != 'y') break;
   }
   }
   fails.close();
   }
Всё бы неплохо, но почему то если я хочу завершить ввод данных, то программа всё ровно предлагает продолжить опять начиная с 1 номера.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 01:13 18
Цитата Сообщение от mster-doc Посмотреть сообщение
А это в самом начале программы, что бы не писать в каждой функции отдельно
Это и надо один раз в начале программы.

Добавлено через 8 минут
Если так записывать в файл, то это:
C++
1
fails.seekp((client.accNum-1) * sizeof(clientData), ios::beg);
уже не нужно. И тогда, для подсчёта структур в файле, подходит код из 12 поста.

Добавлено через 1 минуту
Цитата Сообщение от mster-doc Посмотреть сообщение
Всё бы неплохо, но почему то если я хочу завершить ввод данных, то программа всё ровно предлагает продолжить опять начиная с 1 номера.
Цикл while() уберите, оставьте один for().
1
16 / 16 / 12
Регистрация: 10.11.2012
Сообщений: 245
24.03.2013, 03:16  [ТС] 19
Вот как бы мне теперь вытащить последний наибольший номер аккаунта, чтобы узнать общее число...
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 03:50 20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     char ch;
     int q;
     for(q = 1; ; q++)
     {
         client.accNum = q;
         cout << "Account number is:"<< q << endl;
         
         
         cout << "Enter Surname" << endl;
         cin >> client.Sur;
         cout << "Enter Name" << endl;
         cin >> client.Name;
         cout << "Enter balance" << endl;
         cin >> client.balance;
         fails.write((const char*)&client, sizeof(clientData));
         if (q == 100) break;
         cout << "Continue? (y/n) ";
         cin >> ch;
         if (ch != 'y') break;
     } 
    
     cout << q << endl;
1
24.03.2013, 03:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2013, 03:50
Помогаю со студенческими работами здесь

Почему не работает программа при некоторых входных данных
Задание найти первый и последний неотрицательные эллементы массива. и вывести их индексы если...

Метод хорд не работает при любых входных данных
уравнение: sqrt( a + ln(x) ) = b * x; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include...

Чтение входных данных размером больше чем 4096 символов
Даны такие условия задачи, что входные данные введенные с клавиатуры (из файла) могут достигать 10...

Составить из тех цифр, которые встречаются во входных данных, максимальное число
Условие: На вход программе подается последовательность символов, среди которых встречаются и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru