簡體   English   中英

如何正確跟蹤 stream position?

[英]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。

我的期望:

  1. 要么就是相應的 ASCII 數字。

  2. 它們都是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.

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