Поэтому я пытаюсь создать программу, которая будет читать 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;
}
Но все, что делает, читается первая запись каждого из трех столбцов ("Time Volt Ampere"), поэтому я, вероятно, должен начать все заново.
Может ли кто-нибудь отправить меня в правильном направлении? Как читать весь столбец, они заставляют программу обнаруживать наибольшее число в указанном столбце?
Я полностью потерян, поэтому любая помощь будет оценена.
Если у вас есть возможность использовать файл в качестве входа, вы можете использовать простой cin, чтобы получить ваши значения для Time, Volt и Amp. (единственное, что вам нужно иметь в виду - игнорировать первую строку, потому что это просто имена)
Если вы знаете, что все три значения в каждой строке будут присутствовать, вы можете создать цикл while, который будет работать до EOF. Затем вы читаете 3 значения (Time, Volt, Amp) и сравниваете с предыдущим Volt. Если предыдущее вольт больше - игнорируйте эту строку и продолжайте движение. Else - сохранить текущее время, вольт и усилитель.
На следующей итерации сравните новые 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
Вы можете использовать sort
для этого, это высокоспециализированная реализация сортировки слиянием, которая, несомненно, включена в ваш дистрибутив cygwin. Вы можете указать, какие столбцы сортировать (переключатель -k), и он работает со входом stdandard и именем файла.
Затем просто возьмите, например, первые 4 строки вывода для учета "специальных" строк. Используйте cat -n
для 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
Я бы определил, как выглядит строка:
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]);
...
)
Вы можете попробовать использовать fscanf. Пожалуйста, взгляните на это. Как использовать fscanf для чтения файла
После того, как вы прочтете, вам нужно будет сравнить значения напряжения каждой строки, чтобы получить максимальное напряжение. Надеюсь, вы знаете, как это сделать.
fgets читает файл, пока не встретит символ новой строки или конец файла.
Если fgets встречает eof перед любым символом, он возвращает нулевой указатель. Поэтому, если вы измените код чтения файла, это должно быть хорошо:
while ( fgets (mystring , 100 , pFile) != NULL )
puts (mystring);
Во-первых, вы должны использовать конструкцию llop, чтобы вы читали весь набор строк. Поэтому попробуйте поместить свои fgets
через некоторое while
.
Затем вам нужно разделить каждую строку пробелами. Для этого используйте strtok
.
Затем я порекомендую вам сохранить переменную max_voltage
и при прохождении через файл вы назначаете ей текущее максимальное значение. Кроме того, вам нужно следить за этой max_voltage
переменного time
компаньона так использовать другие переменный для этого один (Google для "найти максимальное значение в массиве", если у вас есть сомнения о том, как это сделать).
После того, как вы попробуете это, опубликуйте свою работу, если у вас есть какие-либо вопросы/уточнения.
До свидания.
sort
gnu специализируется именно на этом ( unixhelp.ed.ac.uk/CGI/man-cgi?sort )!