簡體   English   中英

在C ++中訪問結構數組中的數據

[英]accessing data within array of structure in C++

這是一項作業,需要我使用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.您只需要擺脫某些不需要的變量。
2.“ eof”功能用於識別是否到達文件末尾。 為此,您需要使用while( !indata.eof() )。
3.“ ReadData”方法應出現在主函數之前,但是,如果要在主函數之后放置函數,則首先需要在主函數之前定義函數聲明(即,在主函數之前,可以將“無效的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM