【问题标题】:Why this code doesn't give any output? It seems like an infinite loop为什么这段代码没有给出任何输出?这似乎是一个无限循环
【发布时间】:2015-11-11 18:31:56
【问题描述】:

我必须编写一个程序来读取具有两列的 .dat 文件。我只对一个感兴趣。它有多组 120 个元素,所以我想将文件分成 120 个元素的组并计算每组的平均值。代码是这样的:

#include<iostream>
#include<fstream>
#include<string>
#include<sstream>

using namespace std;

int i, k=0;
double temp [120];
double tmean, total=0;

int main()
{

    ifstream fin ("P01-05 tensione di vapore di riferimento fino 180°C.dat");

    if (!fin)
    {
        cerr << "\nErrore: non si puo aprire il file.\n" << endl;
    exit(1);
    }

    string line;

    ofstream fout;
    fout.open("tmean.dat", ios::out);
    fout << "Tmean" << endl;

    while (fin >> std::skipws && !fin.eof())
    {
       for(i=0; i<120; i++)
       {
           getline(fin,line);
           istringstream ss(line);    

           double col1;      
           double col2;      

           ss >> col1;   //col1=TIME
           ss >> col2;   //col2=TEMPERATURE

           temp[i] = col2;
           total += temp[i];
           k++;

       }

       tmean = total/k;

       fout << tmean << endl;       
   }

   return 0;
}

我已经编译并执行了它,但它不起作用,它就像一个无限循环。它没有给我任何输出。为什么?

【问题讨论】:

  • 执行后tmean.dat文件有内容吗?有Tmean线吗?
  • @SashaPachev 不,它不会打开文件 tmean.dat,因为我认为程序会导致无限循环!
  • 您是否尝试过使用调试器?添加了打印语句以显示中间步骤?这些都是您在此处发布之前应该执行的所有基本调试步骤。
  • 首先,删除输入文件名中的空格。其次,使用调试器逐步运行您的代码。 那么你应该问问周围,如果你仍然卡住。另请查看创建minimal, complete, and verifiable example。您的数据文件丢失。
  • 您的代码中没有任何无限循环,您一定是误解了您所看到的内容

标签: c++ arrays file-io exe


【解决方案1】:

鉴于您是初学者,这里有一些代码显示如何检查您的输入操作是否成功,否则会输出一些有用的错误消息以帮助您找到文件中的违规行。

注意事项:

  • 错误消息中的“[i]”值是当前正在读取的“组”中的相对行号,而不是文件开头的绝对行号。

  • 仅在组之间接受空行(std::skipws 会跳过它)。

  • FATAL 使用宏可能会造成混淆:总而言之,只有宏可以接受"i " &lt;&lt; i 之类的参数并将它们添加到流式操作中。 do { ... } while (false) 是包装宏的标准方法,因此它可以在 if else 语句中正常工作:如果您好奇,可以搜索详细信息。

 

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

#define FATAL(MSG) \
    do { \
        std::cerr << "Errore: " << MSG << '\n'; \
        exit(1); \
    } while (false)

int main()
{
    if (std::ifstream fin{"P01-05 tensione di vapore di riferimento fino 180°C.dat"})
    {
        if (std::ofstream fout{"tmean.dat"})
        {
            fout << "Tmean\n";
            while (fin >> std::skipws && !fin.eof())
            {
                const int group_size = 120;
                double temp[group_size];
                double total = 0;
                for (int i=0; i < group_size; ++i)
                {
                    std::string line;
                    if (getline(fin, line))
                    {
                        std::istringstream ss(line);
                        double time;
                        if (ss >> time >> temp[i])
                            total += temp[i];
                        else
                            FATAL("unable to parse 2 doubles from line '"
                                  << line << "' for [" << i << ']');
                    }
                    else
                        // will rarely happen after checking !eof()
                        FATAL("failed to read needed line from file for ["
                              << i << ']');
                }
                double tmean = total / group_size;
                fout << tmean << '\n';       
            }
        }
        else
            FATAL("could not open output file.");
    }
    else
        FATAL("non si puo aprire il file.");
}

【讨论】:

  • 非常感谢。那么宏味精有调试功能吗?如果您愿意,为了更完整,我可以附上我从中读取值的文件 .dat。
  • 我试图编译你建议我的代码,但它在第 14 行给出错误,其中第一个 if 函数是 ifstream。它给出了这个错误:'[Error] in C++98'fin' must be initialized by constructor, not by '{...}''
  • @PaoloOrsatti:此代码使用 C++11 标准(从 2011 年开始) - 如果您的编译器使用 1998 标准,它将无法工作。如果您使用的是 GNU 或 clang,请尝试将 -std=c++11 添加到编译命令行,或者阅读您的编译器或 IDE 文档。如果这太麻烦,请尝试将{} 更改为()。干杯
  • 我尝试将 -std=c++11 添加到命令行,但它给了我它无法识别命令行选项的错误。我还更改了 _( 和 ) 中的 _{_ 和 } 但它返回了另一个错误:' [Error] expected primary-expression before 'fin' '。
  • @PaoloOrsatti:您使用的是哪个编译器和版本?同时,您可以使用std::ifstream fin("P01-05 tensione di vapore di riferimento fino 180°C.dat"); if (fin) ... 和类似的fout
猜你喜欢
  • 2013-07-25
  • 2022-08-02
  • 2013-12-13
  • 1970-01-01
  • 2022-06-13
  • 2021-02-24
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多