Форум программистов, компьютерный форум 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
25.03.2013, 01:18     Файл: Фильтрация входных данных #41
Цитата Сообщение от mster-doc Посмотреть сообщение
Вот написал функцию удаления, правда она пока что удаляет все записи.
Тут без вектора не обойтись. Создаётся вектор структур и временная структура. Вводится номер записи, которую нужно удалить. Открывается файл для чтения. Читаются, по очереди, структуры из файла во временную структуру, потом структура помещается в вектор. Когда считывается нужная для удаления, она в вектор не помещается, но запоминается её номер. Дальше нужно менять номера структур, которые будут помещаться в вектор. Следующей считанной структуре, перед помещением в вектор, присваивается номер уделённой, он увеличивается и т.д. Потом открывается файл для чтения с тем же именем, и туда записывается вектор структур.

Добавлено через 2 минуты
Цитата Сообщение от mster-doc Посмотреть сообщение
Не, ну просто тут как выяснилось если опять решить добавлять аккаунты, их порядковый номер опять начинается с 1
Если использовать второй код из 37 поста, то у всех структур будут неповторяющиеся номера, идущие подряд.

Добавлено через 8 минут
Функцию подсчёта нужно так переписать (на случай, что файла ещё нет, а выбрано добавление записи):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int c_r()
{
    ifstream fails("credit.dat", ios::binary);
    if (fails.is_open())
    { 
        fails.seekg(0, ios::end);
        int size = fails.tellg(); // size - размер файла в байтах
        fails.close();
  
        int n = size / sizeof(clientData); // количество структур в файле 
        return n;
    }
    return 0;
}
Добавлено через 8 минут
И везде, где есть открытие файла для чтения, сделать обработку ошибки открытия. Например:
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
void find()
{
   clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::in | ios::binary);
   if (!fails.is_open()) cout << "The file does not exist!" << endl;
   else
   {
        cout << "\n Enter account number: ";
        int t;
        cin >> t;
 
        cout << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
              
        while(fails)
        {      
            fails.read((char*)&client, sizeof(clientData));
            if (client.accNum ==t)
            {
                cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl;
                break;
            } 
        } 
   
        fails.close();
   }
 
}
Добавлено через 6 минут
И обработку ошибки ввода неверного номера аккаунта... И т.д., и т.п. ...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 01:51  [ТС]     Файл: Фильтрация входных данных #42
Эх с векторами я ещё не знаком(((
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 02:30     Файл: Фильтрация входных данных #43
Цитата Сообщение от mster-doc Посмотреть сообщение
Эх с векторами я ещё не знаком(((
Значит динамический массив под структуры. Узнали количество записей в файле, создали динамический массив под это количество минус один (минус удаляемая структура). Не забыть после записи в новый файл освободить память.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 18:55  [ТС]     Файл: Фильтрация входных данных #44
Так, моя функция изменения баланса перестала почему то работать, не могу понять почему

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
void c_b_a()
{
     clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::in | ios::binary);  
    int t ;
    
    cout << "\n Enter account number: ";
              cin >> t;
              
              while(fails)
              {      
       if (client.accNum == t)
           cout << client.balance << endl; 
       fails.read((char*)&client, sizeof(clientData));
       
       fails.open("credit.dat", ios::app |ios::out | ios::binary);
       
                cout << "Enter new balance" << endl;
         cin >> client.balance;
         fails.write((const char*)&client, sizeof(clientData));
   } 
   
   fails.close();
 
}
библиотеки

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

Добавлено через 6 минут
вернее вот код
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
void c_b_a()
{
     clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::in | ios::binary);  
    int t ;
    
    cout << "\n Enter account number: ";
              cin >> t;
              
              while(fails)
              {      
       if (client.accNum == t)
           cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
       fails.read((char*)&client, sizeof(clientData));
       
       fails.open("credit.dat", ios::app |ios::out | ios::binary);
       
                cout << "Enter new balance" << endl;
         cin >> client.balance;
         fails.write((const char*)&client, sizeof(clientData));
   } 
   
   fails.close();
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 19:09     Файл: Фильтрация входных данных #45
Как она должна работать?
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 20:20  [ТС]     Файл: Фильтрация входных данных #46
должна менять баланс у указанного аккаунта

Добавлено через 44 секунды
она у меня работала, я её писал одну из первых
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 20:46     Файл: Фильтрация входных данных #47
Цитата Сообщение от mster-doc Посмотреть сообщение
она у меня работала, я её писал одну из первых
Работала, но как? Записывала изменённый аккаунт в конец файла? Разве это хорошая идея? Причём, файл открыт в одном режиме, не закрыв, открываете его в другом режиме... Плохо...
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 23:57  [ТС]     Файл: Фильтрация входных данных #48
Ну вот это точно, должно в теории работать но не работает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void c_b_a()
{
     clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::app | ios::out | ios::binary);  
    int t ;
    
    cout << "\n Enter account number: ";
              cin >> t;
                   
       if (client.accNum == t)
           cout << client.balance << endl; 
       fails.read((char*)&client, sizeof(clientData));
       
                cout << "Enter new balance" << endl;
         cin >> client.balance;
         fails.write((const char*)&client, sizeof(clientData));
   
   fails.close();
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 00:18     Файл: Фильтрация входных данных #49
Идея сама по себе плоха. Нужно перезаписывать нужный аккаунт, а не создавать такой же, только с изменённым полем и записывать его в конец файла. Получаются два (а дальше - больше) аккаунта с одинаковыми номерами и пр. Это не то, что нужно...

Добавлено через 2 минуты
Должно быть так: считать нужный, изменить поле balance, записать на то же место в файле.

Добавлено через 2 минуты
И перед тем как начать поиск в файле, получить количество аккаунтов в файле и проверить введённый номер на то, чтобы он был больше 0 и не больше, чем количество аккаунтов в файле (чтобы попусту не перебирать файл).
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
26.03.2013, 04:30  [ТС]     Файл: Фильтрация входных данных #50
Так... что-то пока что не очень выходит...
Вообще вместо изменения баланса почти вышло удаление))
Вернее вышло одноразовое удаление.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2013, 05:51     Файл: Фильтрация входных данных #51
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
void c_b_a()
{
    clientData client;
    fstream fails("credit.dat", ios::in | ios::out | ios::binary); 
      
    cout << " Enter account number: ";
    int t;
    cin >> t;
    
    int q = c_r(); // сколько аккаунтов в файле
    
    if (t <= 0 || t > q)
    {
         cout << "\n This account does not exist!" << endl;
         return;
    }
              
    while(fails)
    {      
        fails.read((char*)&client, sizeof(clientData));
        
        if (client.accNum == t) // если нашли нужный аккаунт
        {
            cout << endl << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
            cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
        
            cout << "\n Enter new balance: ";
            cin >> client.balance;
            
            cout << endl << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
            cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
            
            fails.seekp(-(int)(sizeof(clientData)), ios::cur); // передвинули курсор назад
        
            fails.write((const char*)&client, sizeof(clientData)); // записали в файл изменённый акканут
        
            break;
        }
    } 
        
    fails.close();
 
}
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
27.03.2013, 20:06  [ТС]     Файл: Фильтрация входных данных #52
Нет в одиночку с векторами я никак не разберусь...
Вот моя жалкая попытка адаптировать код удаления под мою программу... ничего не вышло.
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
void delit()
{
    clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::in | ios:: out | ios::binary);
   
   int q = c_r();
      
    vector  client();
 
 
 
    for ( int t = 0; t < q; t++ )
           if (!fails.is_open()) 
   cout << "The file does not exist!" << endl;
   
   else
{    
   cout << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
   fails.read((char*)&client, sizeof(clientData));
   while(fails)
   {      
       if (client.accNum !=0)
           cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
       fails.read((char*)&client, sizeof(clientData));
   } 
 
    // ÓäГ*ëÿåì 1 - ГЈГ®
    int Deleted = 0;
    
    client.erase ( client.begin() + Deleted ); // Г*ГіГ¦Г*Г® ГЄГ*ГЄ ГІГ® ГЁГ*èöèГ*ëèçèðîâГ*ГІГј ïåðâûé ГЁ ïîñëåäГ*ГЁГ©
 
    cout << endl;
 
    for ( int m = 0; m < q; m++ )
           if (!fails.is_open()) 
   cout << "The file does not exist!" << endl;
   
   else
{    
   cout << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
   fails.read((char*)&client, sizeof(clientData));
   while(fails)
   {      
       if (client.accNum !=0)
           cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
       fails.read((char*)&client, sizeof(clientData));
 
 
        
    fails.close();
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 21:31     Файл: Фильтрация входных данных #53
Это что?
C++
1
vector  client();
Этот код разве компилируется?
Вектор структур так объявляется:
C++
1
vector <clientData> vec_client;
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
27.03.2013, 22:30  [ТС]     Файл: Фильтрация входных данных #54
Нет, код пока что не компилируется к сожалению.

Добавлено через 2 минуты
я не совсем понимаю что вот эта строка делать должна
C++
1
    PerVector.erase ( PerVector.begin() + Deleted );
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 22:38     Файл: Фильтрация входных данных #55
Цитата Сообщение от mster-doc Посмотреть сообщение
я не совсем понимаю что вот эта строка делать должна
Удаляет элемент, на который ссылается итератор.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
28.03.2013, 00:29  [ТС]     Файл: Фильтрация входных данных #56
Пишет ошибку в троке
C++
1
2
3
4
 ...
    
    client.accNum ( d + Deleted );
...
C++
1
2
3
4
5
6
7
8
9
 ...   int Deleted = 0;
    int d;
    
    cout << "Enter the account number you want to delete:";
    cin >> d;
    
    client.accNum ( d + Deleted );
 
    cout << endl;...
Добавлено через 1 минуту
Хотя я активировал всё что активировалось
clientData client;
fstream fails;

fails.open("credit.dat", ios::in | ios:: out | ios::binary);

Добавлено через 43 секунды
пишет что
client.clientData :: accNum" не может быть использован в качестве функции
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.03.2013, 04:23     Файл: Фильтрация входных данных #57
Правильно пишет... Тут всё неправильно...

Добавлено через 1 час 27 минут
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
void delit()
{
    int q = c_r(); // сколько аккаунтов в файле
    if (q == 0) 
    {
        cout << "The file does not exist or is empty!" << endl;
        return;
    }
 
    cout << " Enter account number: ";
    int t;
    cin >> t;
    
    if (t <= 0 || t > q)
    {
         cout << "\n This account does not exist!" << endl;
         return;
    }
 
    ifstream fails("credit.dat", ios::binary);
    
    vector <clientData> vec_client; // вектор для аккаунтов
    clientData client;
 
    for (int i = 0; i < q; ++i)
    {  
        fails.read((char*)&client, sizeof(clientData));
        if (client.accNum != t) 
        {
            if (client.accNum > t) // номера, идущие после удаляемого, переписываются
            {
                client.accNum = t;
                ++t;
            }
            
            vec_client.push_back(client); // если считали неудаляемый, то в вектор
        }
        else 
        {
            cout << endl;
            cout << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
            cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
            cout << "\n Delete? (y/n): ";
            
            char ch;
            cin >> ch;
            if (ch == 'n') // если передумали удалять
            {
                fails.close();
                return;
            }
         }
     }
     fails.close();
 
     ofstream fout("credit.dat", ios::binary);
 
     for (int i = 0; i < vec_client.size(); ++i)
        fout.write((const char*)&vec_client[i], sizeof(clientData));
    
    cout << "\nAccount deleted!" << endl;
    
    fout.close();
}
Добавлено через 1 час 26 минут
В других функциях встречается такая конструкция:
C++
1
2
3
4
5
6
7
8
9
clientData client;
...
fails.read((char*)&client, sizeof(clientData));
while(fails)
{      
    if (client.accNum !=0)
           outputFile << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
       fails.read((char*)&client, sizeof(clientData));
}
Можете объяснить в чём смысл проверки: if (client.accNum !=0) ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.03.2013, 06:39     Файл: Фильтрация входных данных #58
Как-то так...
Вложения
Тип файла: rar main.rar (2.2 Кб, 3 просмотров)
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
28.03.2013, 13:06  [ТС]     Файл: Фильтрация входных данных #59
Я исправил там одна функция не очень правильно работала

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
void p_d()
{
     clientData client;
     fstream fails; 
     
     fails.open("credit.dat", ios::in | ios::binary); 
     
     if (!fails.is_open()) 
     cout << "The file does not exist!" << endl;
     
     else
     {
         int t = 0;
         
         cout << setw(10) << "Account" << setw(10) << "Surname"  << setw(10) << "Name" << setw(10) << "Ballance" << endl;
         
         fails.read((char*)&client, sizeof(clientData));
         
         while(fails)
         {      
                if (client.balance < t)
                
                cout << setw(10) << client.accNum << setw(10) << client.Sur << setw(10) << client.Name << setw(10) << client.balance << endl; 
                fails.read((char*)&client, sizeof(clientData));
         } 
         
         fails.close();
     }
 
}
Теперь всё норм, большое спасибо тебе.

И спасибо за пояснения в коде, помогают разобраться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 18:00     Файл: Фильтрация входных данных
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.03.2013, 18:00     Файл: Фильтрация входных данных #60
Да, там я лишнюю конструкцию вставил: ввод номера аккаунта (копировал из других функций). Там ввод не нужен.
Цитата Сообщение от mster-doc Посмотреть сообщение
Я исправил
Но это не исправление. С упорством, достойным лучшего применения, продолжаете писать непонятный код. Зачем там чтение перед циклом while(). Его смысл?
Yandex
Объявления
28.03.2013, 18:00     Файл: Фильтрация входных данных
Ответ Создать тему
Опции темы

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