![](/img/trans.png)
[英]C++ ofstream - only 1 string gets written to file, previous string is overwritten, why?
[英]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.