Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

60
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
24.03.2013, 22:29  [ТС] #31
Dev-C++
Нет, Компилятор жалуется на код из с_r();
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 23:06 #32
Цитата Сообщение от mster-doc Посмотреть сообщение
Нет, Компилятор жалуется на код из с_r();
Наверное пишет, что не так? Почему не исправляете?

Добавлено через 2 минуты
Почему нет этого?
C++
1
#include <string>
Добавлено через 21 минуту
Сравните код из 12 поста с тем, который у вас в функции с_r() и найдите отличия...
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
24.03.2013, 23:39  [ТС] #33
Вот исправил, теперь код компилируетса, но результат не тот
C++
1
2
3
4
5
6
7
8
9
10
11
12
void c_r()
{
     clientData client;
   fstream fails; 
   
   fails.open("credit.dat", ios::in | ios::binary); 
fails.seekg(0, ios::end);
int size = fails.tellg();
fails.seekg(0);
  
int n = size / sizeof(clientData);
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.03.2013, 23:56 #34
Цитата Сообщение от mster-doc Посмотреть сообщение
но результат не тот
И в чём не тот? Зачем вам в этой функции
C++
1
clientData client;
Для чего вам вообще эта фнкция, если она ничего не возвращает и не выводит?

Добавлено через 45 секунд
У меня код нормально работает.
1
Миниатюры
Файл: Фильтрация входных данных  
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 00:01 #35
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему нет этого?
C++
1
#include <string>
Исправили?
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 00:02  [ТС] #36
Да библиотеку добавил.
Точно, вот пока меня носом не тыкнешь не сделаю, у меня теперь там тоже всё работает правильно.
Сейчас нужно попробовать теперь сделать возможность удаление записи...
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 00:21 #37
Есть одна неправильность, на скрине видно. Когда добавляется новая запись, счёт идёт опять с 1. Нужно сначала выяснить сколько записей есть в файле (для этого есть функция, но нужно, чтобы она возвращала значение), а потом продолжить запись со следующего номера.

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
int c_r()
{
    ifstream fails("credit.dat", ios::binary); 
    fails.seekg(0, ios::end);
    int size = fails.tellg(); // size - размер файла в байтах
    fails.close();
  
    int n = size / sizeof(clientData); // количество структур в файле 
    return n;
}
В тексте программы, поставить эту функцию перед другими функциями (чтобы в других была видна).

Добавлено через 2 минуты
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
void add_new()
{
   clientData client;
   fstream fails; 
   
   int q = c_r();
   ++q;
 
   fails.open("credit.dat", ios::app | ios::out | ios::binary);  
   
   char ch;
         for( ; 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();
}
Добавлено через 59 секунд
C++
1
2
3
4
5
6
7
8
...
 else if(i == 7)
         {
              
              cout << "\n Count records: " << c_r() << endl;
              
         }
...
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 00:37  [ТС] #38
(Поправки учёл)

Вот написал функцию удаления, правда она пока что удаляет все записи.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void delit()
{
     clientData client;
     fstream fails; 
   
    cout << "Enter the account number you want to delete";
    cin >> client.accNum;
    
    cin.ignore();
 
    fstream file("credit.dat", ios::out | ios::binary);
    
    file.close();
 
 
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 00:38 #39
Зачем в функции поиска, перед while(), идёт чтение из файла? Не нужно... И, если все номера аккаунтов в файле разные, то нет смысла, после нахождения нужного, продолжать поиск, нужно сделать выход из while().
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 00:47  [ТС] #40
Не, ну просто тут как выяснилось если опять решить добавлять аккаунты, их порядковый номер опять начинается с 1
0
alsav22
5426 / 4821 / 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 минут
И обработку ошибки ввода неверного номера аккаунта... И т.д., и т.п. ...
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
25.03.2013, 01:51  [ТС] #42
Эх с векторами я ещё не знаком(((
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 02:30 #43
Цитата Сообщение от mster-doc Посмотреть сообщение
Эх с векторами я ещё не знаком(((
Значит динамический массив под структуры. Узнали количество записей в файле, создали динамический массив под это количество минус один (минус удаляемая структура). Не забыть после записи в новый файл освободить память.
1
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();
 
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.03.2013, 19:09 #45
Как она должна работать?
1
25.03.2013, 19:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 19:09
Привет! Вот еще темы с ответами:

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

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

Двусвязный список, фильтрация данных - C++
Добрый день, многоуважаемые форумчане! Я окончательно запутался в этой теме. Очень нуждаюсь в Вашей помощи :( Есть код. Ужасно кривой. ...

ввод структурированных данных в файл и вывод данных из этого файла на экран (сделать хра-нилище данных в файле). - C++
Здравствуйте) помогите написать программу, осуществляющую ввод структурированных данных в файл и вывод данных из этого файла на экран...


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

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

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