首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文本文件中读取Min和Max

从文本文件中读取Min和Max
EN

Code Review用户
提问于 2018-11-01 18:49:41
回答 2查看 1.2K关注 0票数 2

我试图写一个程序,将读取最高和最低的电压,以及它的相关放大器和时间。我能找到最大值,但我得到的是最小值的所有零。我需要帮助。请谢谢你。

txt文件示例:

代码语言:javascript
复制
Time    Volt    Ampere
0.0001  9.77667 0.147408
0.00015 9.76583 0.147525
0.0002  9.76833 0.147692
0.00025 9.75833 0.147442
0.0003  9.76833 0.147192
0.00035 9.78167 0.1473
0.0004  9.76667 0.147317
0.00045 9.765   0.14715
0.0005  9.75667 0.147
0.00055 9.765   0.14695
0.0006  9.77    0.1471
0.00065 9.7675  0.147417
0.0007  9.7725  0.147417
0.00075 9.755   0.14735
0.0008  9.765   0.147725
0.00085 9.76583 0.147783

预期最低产出:

代码语言:javascript
复制
Time = 0.00075  Volt = 9.755 Ampere = 0.14735

预期最大产出:

代码语言:javascript
复制
Time= 0.00035 Volt = 9.78167 Ampere = 0.1473
代码语言:javascript
复制
int main(void)
{
//Declare Variables
string a, b, c;

double time, volt, ampere;
double maxVolt = 0, maxTime, maxAmpere;
double minVolt = 10, minTime, minAmpere;

//Read from the Volts.txt file
ifstream myFile("D:\\tabit\\Documents\\Volts.txt");

//Check if the file can be opened
if (myFile.is_open())
{
    while (myFile >> a >> b >> c)
    {
        time = atof(a.c_str());
        volt = atof(b.c_str());
        ampere = atof(c.c_str());

        if (volt >= maxVolt)
        {
            maxTime = time;
            maxVolt = volt;
            maxAmpere = ampere;
        }
        if (volt < minVolt)
        {
            minTime = time;
            minVolt = volt;
            minAmpere = ampere;
        }
    }
    //Close the file
    myFile.close();
}
//Give error message if the file cannot be opened
else return(1);

//Display the Maximum results
cout << "Max Volt: " << maxVolt << endl;
cout << "Max Time: " << maxTime << endl;
cout << "Max Ampere: " << maxAmpere << endl;

//Display the Minimum results
cout << "Min Volt: " << minVolt << endl;
cout << "Min Time: " << minTime << endl;
cout << "Min Ampere: " << minAmpere << endl;

return 0;
}
EN

回答 2

Code Review用户

发布于 2018-11-01 20:57:15

您的代码缺少所需的标头--至少是<fstream><iostream>。似乎还有一个using namespace std;潜伏在某个地方;这是一个错误的做法,可以巧妙地破坏您的代码,所以我建议您显式地限定您使用的名称(为了节省输入,std是一个非常短的名称)。

在C++中,我们可以声明int main() --这是一个原型,与我们需要编写int main(void)的C语言不同。在C++看来,后者无疑是异乎寻常的。

如果文件打开失败,提前返回可能会更清楚:

代码语言:javascript
复制
if (!myFile) {
    std::cerr << "Couldn't open input file";
    return 1;
}

我对编译后的文件名有点不舒服,这使得程序变得相当不灵活。要么提供名称作为命令行参数,要么简单地从标准输入读取,以便程序可以从任何文件或管道中读取。

如果忽略结果,关闭输入流就没有什么意义了--流的析构函数会为我们完成这个任务,所以让它超出范围就行了。

请注意,std::endl包括输出流的刷新-最好将'\n'写成行结束符(该流将在程序出口处刷新)。

票数 2
EN

Code Review用户

发布于 2018-11-02 03:55:55

  • 通常,只有工作代码才能被检查。这里没有包含,缺少using指令.
  • 不要在同一行中声明多个变量
  • 在检查打开文件后,在最接近的范围内定义变量。
  • 在这里,既然您的值(时间、伏特、安培)似乎是打包在一起的,为什么不将它们封装在一个结构中呢?
  • 同样,您的max*和min*值成对,使用std::pair
  • 您可以将您的值声明为double,但指定一个整数。相反,分配0.010.0
  • 不要使用一个完整的嵌套if,而是使用一个卫士子句,如@TobySpeight所示
  • 比较浮点数有时会给出错误的结果,小心,或者备份一个更安全的方法。(更多信息)
  • 如果最大伏特等于电流伏特,你不想重新分配,所以比较“低于”就足够了。或者改变最小伏特和电流伏特之间的比较关系,使之一致。
  • 跳过myFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');的第一行(需要#include <limits>)。
  • 为什么把值放在字符串中,然后转换成双值?直接投到双打!
  • 使用std::endl发送一个'\n'字符,然后刷新输出缓冲区,除非您知道必须这样做,否则您不需要支付刷新的费用。当您需要它时,显式地使用std::刷新来显示您的意图。
  • 您不想显式地关闭流,RAII会神奇地为您做这件事。

把这一切结合起来,它就会:

代码语言:javascript
复制
#include <fstream>
#include <iostream>
#include <limits>
#include <utility>

struct Record
{
    double volt{};  
    double time{};
    double ampere{};  
};

int main()
{
    std::ifstream myFile("records.txt");

    if (!myFile) {
        std::cerr << "Couldn't open input file";
        return 1;
    }

    myFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    Record current{};
    auto minmax = std::make_pair<Record, Record>({10.,10.,10.}, {0.,0.,0.});

    while (myFile >> current.time >> current.volt >> current.ampere) {
        if (current.volt < minmax.first.volt) {
            minmax.first = current;
        }
        if (current.volt > minmax.second.volt) {
            minmax.second = current;
        }
    }

    //Display the Minimum results
    std::cout << "Min Volt: "   <<  minmax.first.volt      << '\n';
    std::cout << "Min Time: "   <<  minmax.first.time      << '\n';
    std::cout << "Min Ampere: " <<  minmax.first.ampere    << '\n';

    //Display the Maximum results
    std::cout << "Max Volt: "   <<  minmax.second.volt     << '\n';
    std::cout << "Max Time: "   <<  minmax.second.time     << '\n';
    std::cout << "Max Ampere: " <<  minmax.second.ampere   << '\n';

    return 0;
}

在线测试

注意:您也可以将记录放在向量中。这样,您可以轻松地处理数据(筛选、排序、.)或者用std::minmax找到最小值和最大值

编辑:至少,如果你觉得我活该,告诉我为什么

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/206744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档