首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 連續輸入多個 vector:cin.clear() 清理緩衝區關鍵技巧

     編輯:關於C語言

問題場景

需連續讀取兩組整數序列分別存入 vector<int> ivec1、ivec2,以 EOF(Ctrl+Z/Ctrl+D)結束每組輸入。直接連續 while(cin>>n) 會導致第二組無法讀取任何數據。

根本原因

第一組讀取遇到 EOF 後,cin 進入失效狀態(eofbit 置位),後續提取操作直接失敗,不再從緩衝區讀取。

解決方案:cin.clear()

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> ivec1, ivec2;
    int n;

    while (cin >> n)
        ivec1.push_back(n);

    cin.clear(); // 關鍵:重置流狀態標志(eofbit/failbit/badbit)

    int m;
    while (cin >> m)
        ivec2.push_back(m);

    // 比較兩 vector 內容
    bool flag = false;
    for (auto iter1 = ivec1.begin(), iter2 = ivec2.begin();
         iter1 != ivec1.end() && iter2 != ivec2.end();
         ++iter1, ++iter2) {
        if (*iter1 != *iter2) { flag = true; break; }
    }
    cout << (flag ? "no" : "yes") << endl;
    return 0;
}

補充說明

  • cin.clear() 僅重置錯誤標志,**不清空緩衝區內容**。若首次輸入留有未讀字符(如換行符),第二次讀取會先消費它們。通常配合 cin.ignore(numeric_limits<streamsize>::max(), '\n') 清空當前行殘留。
  • 若輸入源為文件重定向,EOF 只出現一次,無法分段讀取;此技巧適用於交互式終端多次輸入 EOF。
  • C++11 起可用 istream_iterator 簡化:vector<int> v(istream_iterator<int>(cin), {}); 但同樣需 cin.clear() 才能再次讀取。

最佳實踐

  1. 讀取循環結束後立即調用 cin.clear()。
  2. 若需換行分隔,額外調用 cin.ignore() 清空行尾。
  3. 檢查 cin.fail() 區分格式錯誤與 EOF。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved