(c++)从txt文件中读取列中的数字数据并确定最高值

(c++) Reading numeric data in a column from a txt file and determining highest value

本文关键字:数据 数字 最高值 读取 c++ txt 文件      更新时间:2023-10-16

所以我正在尝试制作一个程序,读取存储时间、电压和安培的txt文件,文本文件如下所示http://pastebin.com/a0ZvYGmj,只有十倍大(它太大了,大到连一个粉盒都装不下)。

所以我要做的是编写一个程序,读取整个电压列,检测最高值(第二列),然后显示它和它发生的时间(第一列)。我也可以用安培来做,但这是可选的。

问题是我真的不知道该怎么办,这就是我迄今为止成功做到的

#include <iostream>  
#include <stdio.h>
using namespace std;
int main()
{
FILE * pFile;
char mystring [100];
pFile = fopen ("voltage.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else {
  if ( fgets (mystring , 100 , pFile) != NULL )
   puts (mystring);
 fclose (pFile);
}
 system ("PAUSE");
 return 0;
}

但所要做的就是阅读3列中每一列的第一个条目("时间伏安"),所以我可能不得不重新开始。

有人能把我送到正确的方向吗?我如何读取整列,它们使程序检测到所述列中的最大数字?

我完全迷路了,所以任何帮助都将不胜感激。

如果您可以选择使用文件作为输入,那么您可以使用简单的cin来获得时间、电压和安培的值。(你唯一需要记住的是忽略第一行,因为它们只是名字)

如果您知道每行中的所有三个值都将存在,那么您可以创建while循环,该循环将运行到EOF。然后读取3个值(时间、伏特、安培),并与之前的伏特进行比较。如果前一个电压更大-忽略这一行,继续前进。否则,保持电流时间、电压和电流。

在下一次迭代中,将新的3个值与迄今为止Volt的最大值进行比较。

这是我的"快速而肮脏"的解决方案:

#include <iostream>
#include <string>
using namespace std;
int main()
{
// cin>>temp goes through names and ignores it since we don't need it
string temp;
cin >> temp;
cin >> temp;
cin >> temp;
float timeval = 0;
float volt = 0;
float amp = 0;
float timevalTemp = 0;
float voltTemp = 0;
float ampTemp = 0;
while(cin >> timevalTemp >> voltTemp >> ampTemp)
{
    if(voltTemp > volt)
    {
        timeval = timevalTemp;
        volt = voltTemp;
        amp = ampTemp;
    }
}
cout << "Max Time: " << timeval << endl;
cout << "Max Volt: " << volt << endl;
cout << "Max Amp: "<< amp << endl;
return 0;
}

如果有什么不清楚的地方,请告诉我。我在你的文本文件上运行了它,它产生了:

Max Time: 0.00035
Max Volt: 9.78167
Max Amp: 0.1473

您可以尝试使用fscanf。请看一下如何使用fscanf读取文件

阅读后,您必须比较每行的电压值,以获得最大电压。我希望你知道怎么做。

首先,必须使用llop构造,以便读取整组行。所以试着把你的fgets放在while里面。

接下来,您需要用空格分隔每一行。使用strtok

接下来,我建议您保留一个max_voltage变量,当您遍历该文件时,为其指定当前的最大值。此外,您需要跟踪该max_voltage变量的time伴随变量,因此请为该变量使用另一个变量(如果您对如何执行有疑问,请在谷歌上搜索"在数组中查找最大值")。

在你尝试之后,如果你有一些问题/需要澄清,请发布你的作品。

再见。

fgets读取文件,直到遇到换行符或文件末尾。

如果fgets在任何字符之前遇到eof,它将返回null指针。因此,如果您将文件读取代码更改为:,应该是可以的

while ( fgets (mystring , 100 , pFile) != NULL )
  puts (mystring);

我会定义一条线的样子:

struct Line {
  double time, volt, ampere;
  int linenumber;
};
istream& operator>>(istream& in, Line& line) {
    ++linenumber;
    return in >> line.time >> line.volt >> line.ampere;
}
ostream& operator<<(ostream& out, const Line& line) {
  return out << "Line: " << line.linenumber 
             << " Time: " << line.time 
             << " Volt: " << line.volt 
             << " Ampere: " << line.ampere;
}

并与CCD_ 7配合使用。

int main()
{
    string dummy;
    std::istream& in = cin;
    in >> dummy >> dummy >> dummy;
    Line max;
    Line line;
    while(in.good()) {
        in >> line;
        if (line.volt > max.volt) max = line;
    }
   cout << "Max line: " << max;
   return 0;
}

(或者您可以将cin替换为文件输入流:

#include <ifstream>
...
    std::ifstream in(argv[1]);
    ...

)

您可以使用sort,它是一个高度专业化的合并排序实现,肯定包含在您的cygwin发行版中。您可以告诉它要对哪些列进行排序(-k开关),并且它可以与stdandard输入和文件名一起使用。

然后只考虑输出的前4行,以考虑"特殊"行。使用cat -n将行号前置。

$ cat -n input.txt | sort -r -k 2  | head -n 10
     1  Time    Volt    Ampere
  4796  0.2398  9.76417 0.147683
  4795  0.23975 9.75667 0.147833
  4794  0.2397  9.77333 0.147867
  4793  0.23965 9.7575  0.14765
  4792  0.2396  9.75167 0.147533
  4791  0.23955 9.75833 0.147542
  4790  0.2395  9.75583 0.147542
  4789  0.23945 9.77    0.1476
  4788  0.2394  9.75583 0.147317