c++ 如何正确跟踪流位置?

hec6srdp  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(116)

我正在写一个程序,它要求我以一种非常特殊的方式从用户那里接收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

为什么字符的输出是以这种方式放入整数中的?
下面是另一个例子:

Input: 5 6 7 8 9
5 6 7 8 9 
Input: a b c d e
0 6 7 8 9

对于第一个遇到的字符,它似乎默认为0,然后重用流的其余部分,这就是我询问流位置的原因。
我的期望:
1.或者是相应的ASCII数字。
1.它们都是0,因为(出于我想知道的原因),从流输入到整数中的字符往往默认为0
我相信输出的方式与流的位置有关,我希望对此进行解释(以及对默认0字符的回答)。
基本上,我对流很好奇,想知道更多关于它们是如何处理的,这似乎是一个怪癖,可以突出这一点。

d6kp6zgx

d6kp6zgx1#

下面是对输出的完整解释。
我现在关注的是a的输入。
第一步是因为a不是一个有效的整数而导致读取失败,这会使cin流进入 error state,并将a[i]设置为零。
下一步是cin >> a[i];返回,程序打印第一步的值。
现在流处于错误状态(从第一步开始),所有后续读取立即失败,没有对任何a[i]进行更改,因此打印以前的值。
所以和水流位置无关。

相关问题