【问题标题】:Why does the loop with C++ io streams break after first iteration?为什么第一次迭代后 C++ io 流的循环会中断?
【发布时间】:2013-03-15 14:11:37
【问题描述】:

这是我到目前为止的代码。我正在从输入文件中获取数据。该文件包含我调用的每个变量所需的所有数据,但是当我运行它时,我只得到一次迭代,然后退出循环。我需要它一直运行到文件末尾。

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;

int main ()
{
    ifstream pTemp("PlanetCelsius.dat");
    int pNumber, pSize;
    string pName;
    double cTemp, fTemp;

    cout << "Number\t" << "Planet Name\t" << "Diameter\t" << "Celsius\t" << "Fahrenheit" << endl;

        while (pTemp >> pNumber) 
        {
            while (pTemp >> pName) 
            {
                while (pTemp >> pSize) 
                {
                    while (pTemp >> cTemp) 
                    {
                        pTemp >> pNumber;
                        cout << pNumber << " ";
                    }
                pTemp >> pName;
            cout << pName << " ";
                }
        pTemp >> pSize;
        cout << pSize << " ";
            }
    pTemp >> cTemp;
    fTemp = 9 * (cTemp) / 5 + 32;
    cout << cTemp << " " << fTemp << endl;
        }

    system ("PAUSE");
        return 0;
}

【问题讨论】:

  • 我建议您为您的问题找到一个更具描述性的标题...这里的大多数人(包括我在内)都会就我们自己的错误或问题提出问题。
  • 用 cout 开始调试
  • 我建议您将您正在使用的编程语言添加到标签中。通过进入帖子我可以清楚地看到它是 C++,但我认为如果你添加它,你可以获得更多结果和更快的方式。
  • 问自己一个问题:“哪个循环只运行一次,哪些循环运行多次次?”仔细考虑您想要做什么以及您的代码实际上在做什么以及您是否需要 所有 那些 while 循环。作为旁注,请don't use system("pause")
  • 我看到一个箭头。 Do you see it?

标签: c++ loops while-loop file-io


【解决方案1】:

你正在做:

while(there's a number)
  while(there's a string)
    while(there's a number)
     while(there's a number)
     take first number
    take first string
  take first number
take first number

并且您的程序会在最里面的 while 循环中获取它可以获取的所有数字,从而与您的数字-字符串-数字-数字序列相混淆。

当第二次检查第一个 while 时,它​​找不到数字,因为最内层的循环已经获取了每个数字,直到第一个字符串并退出。

使用 while()s 是一个不好的选择,请尝试按照 spin_eight 的建议解析文件。

【讨论】:

    【解决方案2】:
    while (cin.good)
    {
        pTemp >> pNumber >> pName >> pSize >> cTemp >> pNumber;
        cout << pNumber << " " << pName << " " << pSize << " ";
        fTemp = 9 * (cTemp) / 5 + 32;
        cout << cTemp << " " << fTemp << endl;
    
    }
    return 0;
    

    我没有看到你的文件结构,但我猜这个代码 sn-p 可以工作。

    【讨论】:

    • 谢谢我最终做了类似的事情,但使用了 while (pTemp >> pnumber) 而不是 cin.good 并且它似乎工作相同。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多