#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
string nom_fich("data.dat");
ofstream fichier(nom_fich.c_str());
string name;
cout <<"The name is: "<< name ;
cin>>ws;
if (getline(cin, name)){
fichier << name <<endl;
} else {
cerr <<"Error!";
}
fichier.close();
return 0;
}
Вопрос: почему, если я ввожу число вместо строки, моя программа не говорит мне "Ошибка!". ?
EDIT: как я могу попытаться достичь своей цели? Я хочу получить "Ошибка!". когда я ввожу тип, который не является строкой типа.
Потому что число является допустимой строкой.
Числа могут быть представлены в виде строк, т.е. Строки могут содержать цифровые символы. Например:
std::string my_string("42");
std::cout << my_string[0]; // prints 4
std::cout << my_string[1]; // prints 2
Вы не можете ввести число. Вы можете ввести последовательность символов, которые могут быть интерпретированы как число, но эта последовательность все еще является символом. Эти символы соответствуют тому, что читает getline
.
Чтение числа в виде строки, безусловно, будет работать: число просто представлено в виде последовательности символов. Если вы хотите, чтобы поток попытался прочесть номер и сбой, если он его не получил, вы бы использовали другой тип для чтения, например:
int number;
if (std::cin >> number) {
std::cout << "ERROR: read a number: " << number << '\n';
}
else if (std::cin.clear(), std::getline(std::cin, name)) {
std::cout << "read a name: " << name << '\n';
}
После безуспешного чтения номера состояние потока clear()
ed и вместо этого оно пытается прочитать имя. Существует тонкая проблема, так как форматированный ввод для int
будет пропускать ведущие пробелы, а std::getline()
не пропускает пробелы. Если пропустить std::noskipws
пробелы - проблема, просто используйте манипулятор std::noskipws
прежде чем пытаться прочитать int
.
Число может быть представлено в виде строки, поэтому std::ifstream::operator >>
принимает интуитивный подход: он обрабатывает любую последовательность std::ifstream::operator >>
символов в виде строки. Сюда также входят десятичные цифры.
Не связанный, но вместо создания избыточной временной переменной nom_fich
для имени вы можете просто написать ofstream fichier("data.dat");
,
std::getline
а не operator>>
.
Поскольку строка "123"
такая же допустимая, как строка "abc"
, или строка "def999"
.
Что касается "как я могу попытаться достичь своей цели?", Вы должны объяснить нам, какова ваша цель, потому что ваш собственный вход не определяет вашу цель, и поэтому мы не можем извлечь из нее вашу цель.
operator>>
использует интуитивно понятный подход: он обрабатывает любую последовательность непустых символов как строку. Это включает в себя цифры, а также. Кроме того, вместо создания избыточной переменнойnom_fich
, вы можете просто написатьofstream fichier("data.dat");
,