C++ пропускает все действия

Сразу к сути. Вот код

#include "info.h"
#include <string>
#include <iostream>
#include <fstream>
#include <ostream>
#include <iomanip>
#include <typeindex>  

using namespace std;


int main(){
    cout << "Input 0 if you wont sing up, else input 1\n>>>";
    int log_sing;
    cin >> log_sing;
    cout << log_sing <<endl<< typeid(log_sing).name()<<endl;
    string name;
    int pin;
    Info* user = new Info();
    Info* user1 = new Info();
    try{ 
        if (log_sing){
            
            cout << "Input your name\n>>>";cin >> name;
            cout << "Input your pin\n>>>";cin >> pin;
            user->setName(name);
            user->setPin(pin);
            // cout << *user;
            ofstream file("names.txt", ios_base::app);
            ofstream file2("passwords.txt", ios_base::app);
            if (file.is_open() and file2.is_open()){
                file << endl << user->getName();
                file2 << endl << user->getPin();
                file.close();
                file2.close();
                cout << "you sing up";
            }
            else{
                cerr << "Error";
                return 1;
            }
        }
        else {
            cout << "Enter you name >>>"; cin >> name ;
            cout << "Enter you PIN-code >>>"; cin >> pin ;
            user->setName(name);
            user->setPin(pin);
            ifstream file("names.txt");
            ifstream file2("passwords.txt");
            if (file.is_open() and file2.is_open())
            {
            string name;
            string pin;
            int auth = 0;
            while(getline(file, name)) {
                if (name.find(user->getName())!=string::npos) {
                    // cout << "name ="<< name.find(user->getName()) << endl << "npos ="<< string::npos << endl;
                    // cout << name << '\n';
                    auth++;
                }
                
            }
            while(getline(file2,pin)){
                string pin_str = to_string(user->getPin());
                if (pin.find(pin_str)!= string::npos){
                    // cout << "pin ="<<pin.find(pin_str) << endl <<"npos =" <<string::npos << endl;
                    // cout << pin << '\n';
                    auth++;
                }
            }
            file.close();
            file2.close();
            if (auth >= 2){
                cout << "You sing ig";
                return 0;
            }
            else{
                cerr << "Error sing in";
                return 1;
            }

            }
            else{
                cerr << "Error, your file not oppened, or its file not found";
            }


        return 0;
        
    }
    }
    catch(...){
        cerr << "Wrong data type";
        return 1;
    }
    
}

Если я ввожу cin >> log_sing; какое-то число, то все норм, а когда я ввожу не число, а строку то у меня не вылезает ошибка, а просто все скипается типа так

Input 0 if you wont sing up, else input 1
>>>z
0
i
Enter you name >>>Enter you PIN-code >>>You sing ig       

но должно происходить так

Input 0 if you wont sing up, else input 1
>>>0
0
i
Enter you name >>>chel
Enter you PIN-code >>>454545
You sing ig        

Так вот, что я хочу, либо чтобы у меня проверялся нормально тип данных и если у меня вводится строка то я сразу прекращал код. Или хотя бы, у меня код выдавал ошибку, так оно сразу пойдет под catch(...){}


Ответы (1 шт):

Автор решения: Georg

Так, я нашёл способ, просто через cin.fail() понять когда вводится не правильный символ. Как я понял cin.fail() просто выводит true, при вводе неправильного символа, или при вводе символов с типом данных отличного от типа данных переменной в которую cin записывает данные, то есть если место int вы написали string. Короче я просто скопировал этот код

while (cin.fail()){
        cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << "Error:Wrong data type\nInput variable again\nInput 0 if you wont sing up, else input 1\n>>>";
        cin >> log_sing;
    }

и немного подстроил под себя. если что для его использования надо подключить библиотеки

#include <limits>
#define NOMINMAX

(да я знаю что #define NOMINMAX не библиотека) но в этом коде я не понимаю что делает строка td::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');, объясните пожалуйста.

→ Ссылка