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

时间:2013-11-21 15:41:26

标签: c++

所以我正在尝试制作一个程序来读取存储时间,电压和安培的txt文件,文本文件看起来像这个http://pastebin.com/a0ZvYGmj,只有十倍大(这个很大,很大,很大)它不适合单个pastebin)。

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

问题是我真的不知道该怎么做,这是我到目前为止设法做的事情

#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列中每一列的第一个条目(“时间伏安”),所以我可能不得不重新开始。

任何人都可以向我发送正确的方向吗?如何读取整个列,它们使程序检测到所述列中的最大数字?

我完全迷失了,所以任何帮助都会受到赞赏。

6 个答案:

答案 0 :(得分:0)

您可以尝试使用fscanf。请查看此How to use fscanf to read a file

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

答案 1 :(得分:0)

首先,您必须使用llop构造,以便阅读整组行。因此,请尝试将fgets置于while

之内

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

接下来,我建议您保留一个max_voltage变量,当您浏览文件时,可以为其指定当前最大值。此外,您需要跟踪max_voltage变量的time个随播广告,因此请使用另一个变量(Google如果您对如何操作有疑问,请“查找数组中的最大值”)。

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

再见。

答案 2 :(得分:0)

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

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

,应该没问题
while ( fgets (mystring , 100 , pFile) != NULL )
  puts (mystring);

答案 3 :(得分:0)

如果您可以选择使用该文件作为输入,那么您可以使用简单的cin来获取Time,Volt和Amp的值。 (你唯一需要记住的是忽略第一行,因为它们只是名字)

如果您知道每行中的所有三个值都存在,那么您可以创建运行到EOF的while循环。然后你读取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

答案 4 :(得分:0)

我会定义一行:

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;
}

并将其与std::cin一起使用。

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]);
    ...

答案 5 :(得分:0)

你可以使用sort,这是一个高度专业化的合并排序实现,肯定包含在你的cygwin发行版中。您可以告诉它要排序的列(-k开关),它们都可以使用标准输入和文件名。

然后就拿前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