只有字符串类型的流的C++

C++/ ofstream with only a string type

本文关键字:C++ 类型 字符串      更新时间:2023-10-16

这是我的代码:

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

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

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

因为数字是一个有效的字符串。

数字可以表示为字符串,即字符串可以包含数字字符。例如:

std::string my_string("42");
std::cout << my_string[0]; // prints 4
std::cout << my_string[1]; // prints 2

您不能输入数字。您可以输入一个可以解释为数字的字符序列,但该序列仍然是字符。这些字符是getline读取的。

数字可以表示为字符串,因此std::ifstream::operator >>采用了直观的方法:它将任何非空白字符序列视为字符串。这也包括十进制数字。


不相关,但您可以只写ofstream fichier("data.dat");,而不是为名称创建一个多余的nom_fich临时变量。

因为字符串"123"与字符串"abc"或字符串"def999"一样有效。

至于"我如何才能达到我的目的?",您必须向我们解释您的目的是什么,因为您自己承认,您自己的代码没有描述该目的,因此我们无法从中提取您的目的。

将数字作为字符串读取肯定有效:数字只是表示为一系列字符。如果你想让流尝试读取一个数字,但没有成功,你可以使用不同的类型来读取,例如:

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()不跳过空白。如果跳过前导空白是个问题,那么在尝试读取int之前,只需使用操纵器std::noskipws