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 шт):
Так, я нашёл способ, просто через 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');
, объясните пожалуйста.