簡體   English   中英

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

[英]C++/ ofstream with only a string type

這是我的代碼:

#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臨時變量ofstream fichier("data.dat");

因為字符串"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()流的狀態,並嘗試讀取名稱。 存在一個細微的問題,因為int的格式化輸入將跳過前導空白,而std::getline()不會跳過空白。 如果跳過前導空格是一個問題, std::noskipws在嘗試讀取int之前使用操縱器std::noskipws

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM