Member 14621201 Ответов: 4

C++ программа для распределения суммы значений в файле


- Привет! У меня есть 3 файла каждый с 5 столбцами я пытаюсь написать код, который проверяет числа в первом столбце, и если он, скажем, найдет 5 строк с тем же номером в столбце 1, чтобы добавить число, найденное в столбце 4, которые находятся на тех же строках, что и в столбце 1. Пример файла:
1     2   3      4               5
126   49  140.0  0.5620E+01  0.1777E+01
126   48  140.0  0.1432E+00  0.4530E-01
126   50  140.0  0.4058E+01  0.1283E+01
127   50  140.0  0.6138E+01  0.1875E+01
127   49  140.0  0.3546E+01  0.1083E+01
127   51  140.0  0.1304E+00  0.3984E-01
128   50  140.0  0.7931E+01  0.2710E+01


в основном хочу проверить, есть ли число 126, а затем добавить то, что найдено во всех 126 строках столбца 4, а затем перейти на 127 и так далее. Моя проблема в том, что я не знаю, как это начать...

Что я уже пробовал:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <math.h>
#include <stdio.h>

using namespace std;

int i, j, m, n, Cf, U, Pu;
double Dp=7288.9692,Dn=8071.3232;

//structura linii


    int A;
    int Z;
    int TKE;
    int Y;
    int erorY;


void reading_file()
{
    ifstream myfile;
    myfile.open(Cf.txt)
}

Richard MacCutchan

Вы можете начать с того, что дадите своим переменным осмысленные имена. Это значительно упростит задачу по мере роста программы.

4 Ответов

Рейтинг:
32

CPallini

Попробуйте следующую программу.
Он принимает входные данные от standard in (перенаправьте ваш файл соответствующим образом) и выведите сумму, когда по крайней мере 3 строки имеют один и тот же столбец 1 значение (измените его в соответствии с вашими потребностями).

#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main()
{
  multimap<int, double>  mm;
  vector < pair <int, double> > vs;

  string line;
  getline( cin, line); // skip the header line

  do
  {
    int i[2];
    double d[3];
    cin >> i[0] >> i[2] >> d[0] >> d[1] >> d[2];
    if ( cin )
      mm.insert( make_pair( i[0], d[1]) );
  } while (cin);


  auto itstart  = mm.begin();
  while (itstart != mm.end() )
  {
    auto itend = mm.upper_bound(itstart->first);
    int count = 0;
    double sum = 0.0;
    for (auto it=itstart; it != itend; ++it)
    {
      sum += it->second;
      ++count;
    }
    if (count >= 3)
      vs.emplace_back( make_pair( itstart->first, sum ));
    itstart = itend;
  }

  for (const auto & p : vs )
    cout << p.first << " " << p.second << endl;

}


Member 14621201

@CPallini Спасибо за бит, но я немного запутался, так как я не ваш обычный пользователь c++, я начал программировать на C#, так что ваше решение немного сбивает меня с толку относительно того, где файл открывается, закрывается и печатает данные. Спасибо еще раз

CPallini

Ну, это современный C++, это может сбить с толку, если вы не привыкли к нему.
Нет никакого открытия и закрытия файла: он получает входные данные от стандартный ввод и отпечатки пальцев, чтобы стандартный вывод. Вы можете перенаправить ввод-вывод в файлы с помощью '<' и '>'. Е. Г.

my_program < Cf.txt

Рейтинг:
23

KarstenK

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


Рейтинг:
2

Member 14621201

Так что мне удалось прочитать файл...

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main() {
    int sum = 0;
    int x;
    ifstream inFile;

    inFile.open("cf.dat");
    if (!inFile) {
        cout << "Unable to open file";
        exit(1); // terminate with error
    }
    
    while (inFile >> x) {
        sum = sum + x;
    }

    inFile.close();
    cout << "Sum = " << sum << endl;
    return 0;
}



Где я должен скользить в о моем файле и читать столбцы на основе некоторых входов с клавиатуры также было бы неплохо для некоторой графики, но я думаю, что это рано все, что я хочу, это распечатка выбранных вещей, которые я хочу сделать, например, столбец 4 добавлен для всех моих значений 118, найденных в столбце 1 ура и спасибо! за доброту и поддержку


Рейтинг:
15

OriginalGriff

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

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

Проверьте это и убедитесь, что это работает идеально, прежде чем двигаться дальше.

Затем напишите другую функцию для обработки чисел: это должно быть довольно легко, все , что вам нужно сделать, это запустить массив данных, ища идентичные значения и используя их, а затем удалить их из вашего массива.

Попробуйте - это не так сложно, как вы могли бы подумать!