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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
22.03.2013, 00:48     Файл: Фильтрация входных данных #1
Здравствуйте, случилась такая вот проблема.
Из кода можно видеть что работа с вводом данных начинается если введён номер аккаунта от 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();
     }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 00:48     Файл: Фильтрация входных данных
Посмотрите здесь:

ввод структурированных данных в файл и вывод данных из этого файла на экран (сделать хра-нилище данных в файле). C++
C++ цифры во входных данных.
C++ Не могу создать файлы входных и выходных данных
Почему не работает программа при некоторых входных данных C++
C++ Как преобразовать картинку чтобы получить адекватный вектор входных данных для нейронной сети?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 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;
}
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
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();
 
}
alsav22
5282 / 4801 / 442
Регистрация: 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();
}
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
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'
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 00:49     Файл: Фильтрация входных данных #6
C++
1
ios::trunc
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
23.03.2013, 02:23  [ТС]     Файл: Фильтрация входных данных #7
Здравствуйте. Помогите пожалуйста кто знает как подсчитать количество заполненных форм в файле?
alsav22
5282 / 4801 / 442
Регистрация: 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/programming/cpp/31_07_00.shtml
http://habrahabr.ru/post/142662/
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
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
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 22:00     Файл: Фильтрация входных данных #10
Цитата Сообщение от mster-doc Посмотреть сообщение
Я что-то если честно не понял как выравнивание полей структуры может помочь мне с подсчётом заполненных структур.
Я не для этого написал об этом.
Насчёт "заполненных форм" я спросил это:
Цитата Сообщение от alsav22 Посмотреть сообщение
Имеете ввиду, бинарно записанных структур?
Или что другое?

Добавлено через 6 минут
Если количество записанных структур в файле, то 1) можно вести подсчёт при записи, 2) взять размер файла и поделить на размер структуры.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
23.03.2013, 22:19  [ТС]     Файл: Фильтрация входных данных #11
Да бинарно.
alsav22
5282 / 4801 / 442
Регистрация: 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); // количество структур в файле
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
23.03.2013, 23:56  [ТС]     Файл: Фильтрация входных данных #13
Да, в бинарном.

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

Добавлено через 31 минуту
Если так сделать, то данный превращаются в набор символов.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 00:07     Файл: Фильтрация входных данных #14
Цитата Сообщение от mster-doc Посмотреть сообщение
Если так сделать, то данный превращаются в набор символов.
Где и что превращается?
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
24.03.2013, 00:32  [ТС]     Файл: Фильтрация входных данных #15
Если я вставляю этот код, то при вызове функции которая показывает все записи там вместо введённых записей какие то странные цифры и буквы.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 00:48     Файл: Фильтрация входных данных #16
Цитата Сообщение от mster-doc Посмотреть сообщение
Если я вставляю этот код
Я не вижу куда и как...

Добавлено через 7 минут
Способ из 12 поста можно использовать, если данные в файл пишутся последовательно. У вас, как я понял, запись идёт в произвольное место файла. Считайте при записи, сколько структур записали.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
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 номера.
alsav22
5282 / 4801 / 442
Регистрация: 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().
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
24.03.2013, 03:16  [ТС]     Файл: Фильтрация входных данных #19
Вот как бы мне теперь вытащить последний наибольший номер аккаунта, чтобы узнать общее число...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 03:50     Файл: Фильтрация входных данных
Еще ссылки по теме:

C++ Проверка на корректность входных данных
C++ Проверка входных данных: вызов и обработка исключения
Чтение входных данных размером больше чем 4096 символов C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 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;
Yandex
Объявления
24.03.2013, 03:50     Файл: Фильтрация входных данных
Ответ Создать тему
Опции темы

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