доступ к данным в массиве структуры в C ++ - PullRequest
0 голосов
/ 05 октября 2018

Это задание, которое потребовало от меня использовать ifstream для потоковой передачи файла CSV .Этот CSV-файл содержит 52 названия состояний и количество различных ресурсов, используемых каждым состоянием.например:

Алабама, 410.20,715.70,169.40,18.00,44.90,309.10,11.90,417.30,64.50,167.40,23.70,0.10,0.40,0.00

затем мне нужно предложить пользователю ввести имя состояния, а вывод - это процент используемых ресурсов.

Я создал структуру, содержащую тип строки и массив для хранения значения каждого состояния, и создал массивструктуры для хранения данных нескольких состояний, но я не уверен, правильный ли мой код, и я хочу знать, как получить доступ к другим данным, таким как хранилище данных в моем двойном массиве, когда пользователь вводит имя состояния.вот мой код:

struct statData 
{
    string statename;
    double StatDataNumber[14];

}DataStruc[51];

int main()
{

    ifstream indata;
    string line;
    statData State;
    State.statename;
    statData Consumption;
    Consumption.StatDataNumber;


    indata.open("Data2016.csv");    //opening file
    if (indata.fail())  //fail safe
    {
        cout << "Fail to open file";
        exit(1);
    }
    getline(indata, line); //skipping the first line of the csv file

    int i;
    int N = 0;
    int NLoop;
    int Loop = 0;
    string InvertValueBefore;
    double InvertValueAfter;
    char comma;

    while (indata.eof())    // before file reache the end
    {
        for (NLoop = 0; NLoop < 51; NLoop++) // struct array loop
        {
            {
                getline(indata, DataStruc[Loop].statename, ',');// getting statename
                for (i = 0; i <= 12; i++)       // each group of data, except last
                {
                    indata >> DataStruc[Loop].StatDataNumber[N] >> comma;// storing data in struct
                    N++;
                }
                getline(indata, InvertValueBefore);                     // store last value as string
                InvertValueAfter = stoi(InvertValueBefore);             // convert it into double
                InvertValueAfter = DataStruc[Loop].StatDataNumber[N];   // store it in array of struct

            }
            Loop++;
        }
    }

    ReadData();
    return 0;
}
void ReadData (ifstream& indata , statData DataStruc[] )
{
    int i;
    string input;
    bool stayinloop = true;

    cout << "Enter a statename or 'q' to quit\n";
    getline(cin, input);

    while (stayinloop == true)
    {
        if (input == "Alabama")
            DataStruc[i].statename == "Alabama";
            DataStruc[i].StatDataNumber[]

    }

}

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

1 Ответ

0 голосов
/ 06 октября 2018

Ваш код в порядке.Тем не менее, определенные моменты:
1. Вам просто нужно избавиться от определенных переменных, которые не требуются.
2. Функция «eof» используется для определения, достигнут ли конец файла.Для чего вам нужно использовать while (! Indata.eof () ).
3. Метод «ReadData» должен появляться перед основной функцией, однако, если вы хотите, чтобы ваши функции были после основной функции, то сначала вам нужно определить объявление функции перед основной функцией (т. Е. Перед основной функцией, выможет поставить «void ReadData (ifstream & indata, statData DataStruc []);»), после чего вы сможете определить свою функцию.

Ниже приведена рабочая версия ваших требований.

#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
using namespace std;

struct statData 
{
    string statename;
    double StatDataNumber[3];

}DataStruc[2];

void ReadData (ifstream& indata , statData DataStruc[])
{
    string input;
    bool stayinloop = true;

    while (stayinloop)
    {
        cout << "\nEnter a statename or 'q' to quit\n";
        getline(cin, input);

        for (int i = 0 ; i < 2; i++)
        {
            if (input == DataStruc[i].statename)
            {
                for(int j = 0 ; j < 3; j++)
                {
                    cout << DataStruc[i].StatDataNumber[j] << ',';
                }
            }
            else if(input == "q")
            {
                stayinloop = false;
            }
        }     
    }
}

int main()
{
    ifstream indata;
    string tempData = "";
    string line;
    string InvertValueBefore = "";
    double InvertValueAfter = 0.0;
    char comma = ',';

    indata.open("test.csv");    //opening file
    if (indata.fail())  //fail safe
    {
        cout << "Fail to open file";
    }
    getline(indata, line); //skipping the first line of the csv file

    while (!indata.eof())    // before file reach the end
    {
        for (int NLoop = 0; NLoop < 2; NLoop++) // struct array loop
        {
            {
                getline(indata, DataStruc[NLoop].statename, comma);// getting statename
                for (int i = 0; i < 2; i++)       // each group of data, except last
                {
                    getline(indata, tempData, comma);
                    DataStruc[NLoop].StatDataNumber[i] = atof(tempData.c_str());
                }
                getline(indata, InvertValueBefore);                     // store last value as string
                InvertValueAfter = atof(InvertValueBefore.c_str());             // convert it into double
                DataStruc[NLoop].StatDataNumber[2] = InvertValueAfter; 
            }
        }
    }

    ReadData(indata, DataStruc);
    return 0;
}
...