簡體   English   中英

如何終止從cin讀取?

[英]How to terminate reading from cin?

我嘗試了這里列出的一堆方法,但沒有一個有效。 它總是在等待更多的輸入。

我試過while(std::getline(std::cin, line))和下面的方法,似乎沒有任何效果:

#include <iostream>
#include <sstream>

using namespace std;

int main(){
  long length = 1UL<<32;
  int array[length];
  // memset(array, 0, (length-1) * sizeof(int));

  for(int i = 0; i < length; i++)
    array[i] = 0;
  string line;
  int num;
  while(!cin.eof()){
    getline(cin,line);
    stringstream ss(line);
    ss >>num;
    array[num]++;
  }
  for(int i = 0; i < length; i++)
      if(array[i]){
          cout << i << ": ";
          cout << array[i] << endl;
      }
}

首先,使用std::cin.eof()來控制你的循環! 它不起作用。 此外,您始終需要在輸入檢查是否成功輸入。

也就是說,要終止輸入,您需要輸入適當的文件結尾字符,可能在行的開頭(它的工作方式完全取決於系統、某些設置等)。 在 Windows 上,您將使用 Ctrl-Z,在 UNIX 上,您將使用 Ctrl-D。

首先,程序的這一部分嘗試在堆棧上分配 4 GB 內存,這在我的機器上不起作用(祝你好運找到任何具有 4 GB 連續內存空間的機器):

long length = 1UL<<32;
int array[length];

如果我將其更改為更合理的:

long length = 32;

然后它對我來說很好用:

$ g++ -g test.cpp -o test && ./test
2
5
# pressed control+d
2: 1
5: 2
$ 

所以我猜還有其他問題。


注意:除非您真的計划使用所有這些索引,否則您可能需要考慮使用unordered_map ,因此您只使用您實際需要的空間。

通過將 "std::cin" 評估為布爾值,即while (cin) ,可以最容易地測試您正在尋找的條件。 但它不會這樣做,直到您嘗試閱讀 EOF 之外的內容,因此請期待一個空的 getline:

#include <iostream>
#include <string>

int main() {
    std::string input;
    while (std::cin) {
        std::cout << "Type something in:\n";
        std::getline(std::cin, input);
        if(input.empty())
            continue;
        std::cout << "You typed [" << input << "]\n";
    }
    std::cout << "Our work here is done.\n";

    return 0;
}

現場演示: http : //ideone.com/QR9fpM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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