2011-07-10 111 views
0

我的程序忽略第二环,我可以不填矢量V2程序将忽略第二循环

  vector<int> v1; 
    vector<int> v2; 
    int elem1,elem2; 

    cout<<"Insert v1: "; 
    while(cin>>elem1){ 
     v1.push_back(elem1); 
    } 

    cout<<"Insert v2: "; 
    while(cin>>elem2){ 
     v2.push_back(elem2); 
    } 
+0

第一个循环已经捕获了来自'cin'的任何输入,使得第二个循环没有任何剩余。你想完成什么? – Howard

+0

会更好,如果你还要求用户在最后输入y或n个字符作为输入,根据这个字符继续循环,直到用户输入y或打破n; – 2011-07-10 17:25:06

回答

5

CIN一直下去,直到所有输出完成后,你的第二个循环是,除非你从打破永远不会被打到您的不知何故第一个循环。我建议你在第一个循环中有某种退出条件(比如像'DONE'之类的某个输入标记,或者一旦你读到了,你应该打破)。

+0

您可以阅读过去的EOF。只需清除eofbit并重置文件位置即可。如果std :: cin绑定到终端,则可以使用EOF作为您正在讨论的输入标记。看到我的答案。请注意,如果std :: cin正在从文件或管道读取数据,我的答案将不起作用。 –

+0

你是对的,但为了简单起见(因为我不知道他到底在做什么),我想他想读取一些元素到v1中,然后读取一个标记,然后读入v2或其他行中。 –

+0

这就是我所假设的他想要的。如果已知输入流被绑定到终端,EOF可以创建一个很好的标记**。不需要解析。刚刚重置,瞧!下一批东西已准备好阅读。 –

0

我猜你正在等待第一个循环结束时,当你输入或什么。但那不是你编码的东西。你编写了“填充v1直到没有输入”,所以没有任何东西放在v2中也就不足为奇了。

也许你可以尝试以下内容,它会读取一行,并将内容放入v1中,然后读取第二行并将内容放入v2中。它使用getline读取单行文本,然后将该行放入字符串流中,一次只能从一个数字读取。

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

void fill_vector_from_one_line(vector<int>& v) 
{ 
    string str; 
    if (getline(cin, str)) 
    { 
     istringstream iss(str); 
     int elem; 
     while (iss >> elem) 
      v.push_back(elem); 
    } 
} 

int main() 
{ 
    cout << "Insert v1: "; 
    fill_vector_from_one_line(v1); 
    cout << "Insert v2: "; 
    fill_vector_from_one_line(v2); 
} 

道歉的任何错误,我没有检查过。

0

重置标准输入。见下文。

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> v1; 
    std::vector<int> v2; 
    int elem; 

    std::cout << "Insert v1: "; 
    while (std::cin >> elem) { 
     v1.push_back (elem); 
    } 

    // Reset std::cin. 
    std::cin.clear(); 
    std::cin.seekg(0, std::ios::beg); 

    std::cout << "Insert v2: "; 
    while (std::cin >> elem) { 
     v2.push_back (elem); 
    } 

    // Just to show that it works. 
    std::cout << "\nv1 elements:\n"; 
    for (unsigned int ii = 0; ii < v1.size(); ++ii) { 
     std::cout << "v1[" << ii << "] = " << v1[ii] << "\n"; 
    } 

    std::cout << "\nv2 elements:\n"; 
    for (unsigned int ii = 0; ii < v2.size(); ++ii) { 
     std::cout << "v2[" << ii << "] = " << v2[ii] << "\n"; 
    } 

    return 0; 
} 

注意,std::cin.clear(); std:cin.seekg();调用将有不同的行为取决于给std :: cin的性质。

  • 如果std :: cin绑定到终端,它将具有OP正在寻找的行为。
  • 如果std :: cin正在从文件读取,则向量v2将是向量v1的碳副本。
  • 如果std :: cin正在读取管道,则向量v2将为空。你不能在管道上看到kg()。