#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;
}
问题:为什么如果我输入数字而不是字符串,我的程序就不会说“错误!” ?
编辑:我怎样才能达到我的目的?我希望得到一个“错误!”当我输入一个不是类型字符串的类型时。
答案 0 :(得分:4)
因为数字是有效的字符串。
答案 1 :(得分:2)
数字可以表示为字符串,即字符串可以包含数字字符。例如:
std::string my_string("42");
std::cout << my_string[0]; // prints 4
std::cout << my_string[1]; // prints 2
答案 2 :(得分:1)
您无法输入数字。您可以输入可以解释为数字的字符序列,但该序列仍然是字符。那些字符是getline
读取的字符。
答案 3 :(得分:0)
数字可以表示为字符串,因此std::ifstream::operator >>
采用直观的方法:它将任何非空字符序列视为字符串。这也包括十进制数字。
不相关,但您可以只写nom_fich
而不是为名称创建多余的ofstream fichier("data.dat");
临时变量。
答案 4 :(得分:0)
因为字符串"123"
与字符串"abc"
或字符串"def999"
一样有效。
至于“我怎样才能达到我的目的?”,你必须向我们解释你的目的是什么,因为你自己承认,你自己的代码没有描述这个目的因此我们无法从中提取你的目的。
答案 5 :(得分:0)
将数字作为字符串读取肯定会起作用:数字只表示为一系列字符。如果您希望流尝试读取数字而在未获取数字时失败,则您将使用其他类型进行读取,例如:
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()
,而是尝试读取名称。有一个微妙的问题,因为int
的格式化输入将跳过前导空格而std::getline()
不跳过空格。如果跳过前导空格是一个问题,只需在尝试阅读std::noskipws
之前使用操纵器int
。