Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
mster-doc
14 / 14 / 12
Регистрация: 10.11.2012
Сообщений: 239
#1

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

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

Здравствуйте, случилась такая вот проблема.
Из кода можно видеть что работа с вводом данных начинается если введён номер аккаунта от 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();
     }
 
}

http://www.cyberforum.ru/cpp-beginners/thread804120.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 00:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Файл: Фильтрация входных данных (C++):

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

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

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

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

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

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

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

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

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

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

Как преобразовать картинку чтобы получить адекватный вектор входных данных для нейронной сети?
Иначе, Как преобразовать картинку к виду массива? Может кто сталкивался?

независимо управлять типом входных данных массива для определения сред. ариф. и возвращаемым значением функции
Нужно сделать чтобы можно было независимо управлять типом входных данных...

Оценить эффективность выбранных алгоритмов шифрования путем проведения процедуры шифрования на входных данных
Люди добрые, нужна служба спасения. В C++ это дело написано, коряво, знаю, case...

вывести три строки, состоящие из символов "#" в таком количестве, в котором указано во входных данных
На вход подаются три натуральных числа (не более 50) -- показатели индикатора...


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

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

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