2017-01-30 83 views
1

我有几个问题,我认为它们是紧密相连的,但是我无法按照我以前在网站上找到的方式修复它们。第二个cin被跳过或不能正常工作

我的问题与cin在我的主要功能中的双重使用有关。我需要从键盘读取数字,以建立小向量或存储单个系数。我不能预先知道我要建立的向量的长度。

这里所涉及的线路:

#include <vector> 
#include <iostream> 
#include <limits> 

int main() { 
    ... 
    double a=0; 
    std::vector<double> coefficients; 
    while (std::cin>>a) { 
     coefficients.push_back(a); 
    } 
    ... 
    std::vector<double> interval; 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max()); 
    while(std::cin>>a) { 
     interval.push_back(a); 
    } 
    std::cout<<interval.size()<<std::endl; 
    std::cout<<*interval.cbegin()<<" "<<*(interval.cend()-1)<<std::endl; 
    ... 
} 

我使用的MacOS都与G ++ 6.3.0和Linux使用g ++ 5.3.0。我发送给编译器的标志是-Wall -std=c++14 -o
在macOS机器上,第二个cin被完全跳过,而在Linux上,第二个读取过程的行为并不像预期的那样。我的意思是如果我在第二个cin处给出-1 1,则打印的矢量大小为0,很明显,程序因分段错误而停止。

在每个cin我在一行中输入所需的数字,如1 0 0 1,然后按enter键,然后按Ctrl + D.

在此先感谢所有! :)

+0

你有没有考虑使用'getline'呢? – molbdnilo

+0

是的,我做到了,除了'cin.ignore'这行外,我的代码可以在Linux机器上按预期运行。但是,macOS的情况并非如此。 那么,我应该永远放弃'cin'? – Sandro

回答

0

您的电话设置流的失败位的忽略。这使得不可能进入循环。您需要在循环之前立即调用std::cin.clear(),以使其运行。当第二个容器中没有数据时,您还有一个超出界限的读取。

#include <vector> 
#include <iostream> 
#include <limits> 
#include <string> 

int main() { 
    double a=0; 
    std::vector<double> coefficients; 
    while (std::cin>>a) { 
     coefficients.push_back(a); 
    } 
    std::cout << coefficients.size() << '\n'; 

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'X'); 
    std::cin.clear(); 
    char c; 
    std::cin>>c; 
    if(c != 'X') 
    { 
     std::cerr << "Invalid separator\n"; 
     return 1; 
    } 

    std::vector<double> interval; 
    while(std::cin >> a) { 
     interval.push_back(a); 
    } 
    std::cout<< interval.size()<<std::endl; 
    if(interval.size()) 
     std::cout<<*interval.cbegin()<<" "<<*(interval.cend()-1)<<std::endl; 

    return 0; 
} 

用下面的数据文件,

$ cat data.txt 
12 23 
42 
X 
1 2 
3 4 5 

产生这样的输出:

$ ./a.out < data     
3 
5 
1 5 
+0

谢谢!我不知道'std :: cin.ignore()'设置流的失败位。现在该程序在Linux上运行良好。在macOS上仍然没有改变,但现在是次要的。 – Sandro

0

你需要作为第二个参数添加一个换行符'\n'cin.ignore()所以它可以杀死的std::cin.ignore(...)的输入按

+0

是的,我也尝试过,但没有改变。在macOS上,第二个cin只是跳过了,而在Linux上它仍然不起作用,正如我上面解释的那样。 – Sandro