Al.*_*.G. -1 c++ file-io iostream c++11 c++14
我有一个文本文件,首先描述一些行,然后描述一些彩色线:
1 2 3 4
5 6 7 8
9 10 11 12
red 1 0 0 1 2 3 4
green 0 1 0 5 6 7 8
blue 0 0 1 9 10 11 12
Run Code Online (Sandbox Code Playgroud)
每个部分中的行数在执行时是未知的
我std::cin >>为这些结构重载了运算符:
struct Point { int x, y; }
struct Line { Point a, b; }
struct Color { float r, g, b; std::string name; };
struct ColorfulLine { Line line; Color color; };
Run Code Online (Sandbox Code Playgroud)
(这里的完整示例:http://ideone.com/bMOaL1 [已经工作 - 根据接受的答案编辑])
现在我需要使用Lines和迭代文件ColorfulLines:
Line line;
while(cin >> line) { cout << "We've got a line!\n"; }
ColorfulLine color_line;
while(cin >> color_line) { cout << "We've got a colorful line!\n"; }
// actually I'm putting them into std::lists but I skipped this part for simplicity
Run Code Online (Sandbox Code Playgroud)
这就是问题 - 永远不会获取彩色线条,即不执行第二个循环.
我假设它为什么会发生,但不知道如何解决它:
当std::cin试图获取第4行时,它失败,因为而不是数字,而是字符串"红色".
接下来,在第二个while循环中,std :: cin尝试读取一个字符串(Color.name),但它看到一个数字,然后也失败了.
我试图在ColorfulLines部分之前添加一些随机单词,希望当第一个循环失败时,第二个循环将从"红色"字符串开始读取,但事实并非如此.
如何解决这个问题?
在第一个循环中断后,std::cin处于不良状态.这就是循环首先打破的原因.对坏流执行读取会立即失败,因此永远不会输入第二个循环.
要解决此问题,请在第一个循环中断后重置错误状态
std::cin.clear();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |