(c ++) Чтение числовых данных в столбце из текстового файла и определение наибольшего значения

0

Поэтому я пытаюсь создать программу, которая будет читать 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"), поэтому я, вероятно, должен начать все заново.

Может ли кто-нибудь отправить меня в правильном направлении? Как читать весь столбец, они заставляют программу обнаруживать наибольшее число в указанном столбце?

Я полностью потерян, поэтому любая помощь будет оценена.

  • 0
    уверен, что вы хотите C ++ для этого? Например, sort gnu специализируется именно на этом ( unixhelp.ed.ac.uk/CGI/man-cgi?sort )!
  • 0
    Вам нужно написать программу на C ++, или вам нужно обработать ваш текстовый файл и вы хотите сделать это на C ++?
Теги:

6 ответов

0
Лучший ответ

Если у вас есть возможность использовать файл в качестве входа, вы можете использовать простой 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
  • 0
    Это очень близко к тому, что я пытаюсь сделать, но я не вижу, что он открывает какой-либо файл, как вы запустили это в текстовом файле? Спасибо за помощь
  • 0
    @ user3018180 Я скомпилировал код. Затем в консоли напишите: ./program <inputfile.txt cin пытается получить ввод от пользователя, если вы не предоставите входной файл, он предложит вам ввести значения. В противном случае он использует файл и работает до тех пор, пока (cin >> time ...) не завершится в цикле while
Показать ещё 12 комментариев
0

Вы можете использовать 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
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]);
    ...

)

  • 0
    Попробовав, я получаю следующее: «Макс. Линия: время 0 Вольт 4.34372e-311 Ампер: 0» Черт, почему этот текстовый файл так трудно читать?
  • 0
    Возможно, вы хотите немного больше понимания вашего текстового файла. Добавьте номера строк или около того ... (обратите внимание, что это не меняет цикл while!)
Показать ещё 2 комментария
0

Вы можете попробовать использовать fscanf. Пожалуйста, взгляните на это. Как использовать fscanf для чтения файла

После того, как вы прочтете, вам нужно будет сравнить значения напряжения каждой строки, чтобы получить максимальное напряжение. Надеюсь, вы знаете, как это сделать.

0

fgets читает файл, пока не встретит символ новой строки или конец файла.

Если fgets встречает eof перед любым символом, он возвращает нулевой указатель. Поэтому, если вы измените код чтения файла, это должно быть хорошо:

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

Во-первых, вы должны использовать конструкцию llop, чтобы вы читали весь набор строк. Поэтому попробуйте поместить свои fgets через некоторое while.

Затем вам нужно разделить каждую строку пробелами. Для этого используйте strtok.

Затем я порекомендую вам сохранить переменную max_voltage и при прохождении через файл вы назначаете ей текущее максимальное значение. Кроме того, вам нужно следить за этой max_voltage переменного time компаньона так использовать другие переменный для этого один (Google для "найти максимальное значение в массиве", если у вас есть сомнения о том, как это сделать).

После того, как вы попробуете это, опубликуйте свою работу, если у вас есть какие-либо вопросы/уточнения.

До свидания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню