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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
#1

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

22.03.2013, 00:48. Просмотров 1982. Ответов 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();
     }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 00:48     Файл: Фильтрация входных данных
Посмотрите здесь:

Проверка на корректность входных данных - C++
Нужно написать программу, которая бы проверяла строку на корректность. Допустимый формат вот такой +7 (233) 555-11-22. Как это сделать? В...

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

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

Почему не работает программа при некоторых входных данных - C++
Задание найти первый и последний неотрицательные эллементы массива. и вывести их индексы если значение size указать 20 то всё...

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

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

Фильтрация Базы Данных - C++
Как создать SQL запрос на фильтрацию по полю. Понял только что его в аксесе нужно делать. Но как, без понятия

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 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
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
5416 / 4812 / 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
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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 00:49     Файл: Фильтрация входных данных #6
C++
1
ios::trunc
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
23.03.2013, 02:23  [ТС]     Файл: Фильтрация входных данных #7
Здравствуйте. Помогите пожалуйста кто знает как подсчитать количество заполненных форм в файле?
alsav22
5416 / 4812 / 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
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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2013, 22:00     Файл: Фильтрация входных данных #10
Цитата Сообщение от mster-doc Посмотреть сообщение
Я что-то если честно не понял как выравнивание полей структуры может помочь мне с подсчётом заполненных структур.
Я не для этого написал об этом.
Насчёт "заполненных форм" я спросил это:
Цитата Сообщение от alsav22 Посмотреть сообщение
Имеете ввиду, бинарно записанных структур?
Или что другое?

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

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

Добавлено через 31 минуту
Если так сделать, то данный превращаются в набор символов.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 00:07     Файл: Фильтрация входных данных #14
Цитата Сообщение от mster-doc Посмотреть сообщение
Если так сделать, то данный превращаются в набор символов.
Где и что превращается?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 00:32     Файл: Фильтрация входных данных
Еще ссылки по теме:

Чтение входных дат - C++
Доброе время суток Я работаю над домашним заданием по языку си. Программа должна переводить знаки кодированные в utf-8 до utf-16. Саму...

Организовать добавление данных в файл, просмотр, поиск и очистку данных - C++
НАписать программу. Компонентами типизированного файла являются записи, состоящие из следующих полей: - фамилия; - имя; - отчество; - город...

Напишите функции записи данных в файл, чтения данных из файла - C++
Файл dаte.in содержит четырех значное число на каждой строке. Напишите функции записи данных в файл, чтения данных из файла. Напишите...

Из входных аргументов достать значения - C++
Здравствуйте, есть консольная программа time.exe. Запускаем ее через консоль: time.exe &quot;15:00 PM&quot; dms Нужно: как красиво...

Присваивание входных параметров в конструкторе - C++
Добрый день. Недавно наткнулся на код такого типа #define MaxSize 100 class Test { private: int Size; public: ...


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

Или воспользуйтесь поиском по форуму:
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
24.03.2013, 00:32  [ТС]     Файл: Фильтрация входных данных #15
Если я вставляю этот код, то при вызове функции которая показывает все записи там вместо введённых записей какие то странные цифры и буквы.
Yandex
Объявления
24.03.2013, 00:32     Файл: Фильтрация входных данных
Ответ Создать тему
Опции темы

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