只有字符串类型的C ++ / ofstream

时间:2013-12-17 22:46:00

标签: c++ ofstream

这是我的代码:

#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;
   }

问题:为什么如果我输入数字而不是字符串,我的程序就不会说“错误!” ?

编辑:我怎样才能达到我的目的?我希望得到一个“错误!”当我输入一个不是类型字符串的类型时。

6 个答案:

答案 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