C ++将数据读入结构数组

时间:2014-04-23 21:36:07

标签: c++ arrays data-structures

我找到了一种方法将数据读入我的数组结构但我无法控制它读取的数量。它将读取输入文件中的所有14个条目,但在读取了14个条目后,它会继续几行,然后停止。但是,如果我将代码放在任何循环中读取数据,无论是在for还是for,它开始打印大量数字而不是文件中包含的数字。有谁知道为什么会这样?有没有办法呢?

输入文件如下所示(不包括点): 文件中有14组数据。因此,如下图所示,第1组将包括格鲁吉亚76.4 10,然后是北卡罗莱纳州95.5 20,依此类推至14套。

输入文件中的数据如下所示:

georgia
76.4 10
north carolina
95.5 20
and so on.

需要将数据打印到屏幕上,如:

georgia 76.4 10
north carolina 95.5 20
etc.

问题在于我的代码是我尝试并且可怕地无法读入输入文件。

#include <iostream>
#include <fstream>
#include <cstdlib>

struct ATdata  
{
   string state;
   double miles;
   int shelters;
};

int readData( ifstream& input, struct ATdata data[] );

int main()
{
    ifstream input;
    char filename[256];
    ATdata data[14];
    int i;

    cout << "Enter input file name: ";
    cin >> filename;

    input.open( filename );

    if ( input.fail() )
    {
        cout << "Input file does not exist." << endl;
        exit(1);
    }

    readData( input, data );

    cout << i << endl;
    return(0);

}

int readData( ifstream& input, struct ATdata data[] )
{
    int i, j;

    getline( input, data[i].state, '\t' );
    input.ignore( 14, '\n' );
    input >> data[i].miles;
    input.ignore( 1, ' ' );
    input >> data[i].shelters;

    for ( j = 0; j < 14; j++ )
    {
        cout << data[j].state << data[j].miles << data[j].shelters << endl;
    }
}

我为尽可能明确的所有信息道歉,以免看起来更加愚蠢。 谢谢你有愉快的一天。

2 个答案:

答案 0 :(得分:1)

getline()需要ostream&string。由于您的类型不是string,因此会出错。我建议您在输入中阅读:

for (int i = 0; i < 14; i++ )
{
   input >> data[i].state >> data[i].miles >> data[i].shelters;
}

顺便说一句,您的statechar,即1个字符。将其设为std::string

答案 1 :(得分:0)

获得整行的最佳方法是使用std::getline。但是,如果您尝试将未格式化的输入与格式化输入混合,那么它会有点棘手。你需要大量的ignore电话和其他guff。我认为一次读取整行总是更清楚,然后使用字符串流来解析该行。

试试这个:

size_t readData( ifstream& input, struct ATdata data[], size_t max_items )
{
    size_t i;

    for ( i = 0; i < max_items; )
    {
        ATdata item;
        getline(input, item.state);

        string line_2;
        if ( ! getline(input, line_2) )
            break;

        istringstream iss(line_2);
        if ( ! (iss >> item.miles >> item.shelters) )
        {
        // skip malformed entry (or you could abort instead)
            continue;
        }

        data[i++] = item;
    }

    return i;
}

用以下方式调用:

size_t num_items = readData(input, data, sizeof data / sizeof data[0]);