[英]How can I correctly keep track of stream position?
我正在編寫一個程序,它要求我以非常特定的方式從用戶那里獲取double
輸入,所以我正在學習流。
最后,我的目標是強制用戶以我希望的方式格式化他們的輸入,即:
2.0 3.0 4.0
-> 雙精度數(或整數),中間有空格且沒有尾隨空格
我一直在使用std::istringstream
以類似於以下示例的方式讀取輸入:
#include <iostream>
#include <sstream>
using namespace std;
int main(){
int a[5] = {0};
while (1){
cout << "Input: ";
string s;
getline(cin, s);
istringstream buffer(s);
for (int i = 0 ; i < 5 ; i++)
buffer >> a[i];
for (int i = 0 ; i < 5 ; i++)
cout << a[i] << " ";
cout << endl;
}
}
我的問題是關於以下終端輸入/輸出:
Input: 1 2 3 4 5
1 2 3 4 5
Input: a b c d e
0 2 3 4 5
為什么將字符的 output 按原樣放入整數?
這是另一個例子:
Input: 5 6 7 8 9
5 6 7 8 9
Input: a b c d e
0 6 7 8 9
對於第一個遇到的字符,它似乎默認為0
,然后重復使用 stream 的 rest,這就是為什么我要問 stream position。
我的期望:
要么就是相應的 ASCII 數字。
它們都是0
,因為(出於我想知道的原因),從 stream 輸入到 integer 的字符往往默認為0
。
我相信 output 是它與 stream position 的關系,我希望對它進行解釋(以及對默認0
字符的回答)。
基本上,我對流很好奇,想知道更多關於它們是如何處理的,這似乎是一個可以突出這一點的怪癖。
這是您的 output 的完整說明。
我專注於a
的輸入。
第一個動作是cin >> a[i];
將a[i]
設置為零。
第二個操作是讀取失敗,因為a
不是有效的 integer。這會將cin
stream 置於錯誤 state中。
第三個動作是cin >> a[i];
返回,程序打印第一步的值。
現在 stream 出現錯誤 state(來自第二步),所有后續讀取均失敗,任何a[i]
均未更改,因此打印了先前的值。
所以與stream position無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.