dados de leitura C ++ em matriz de estruturas

votos
0

Eu encontrei uma maneira de ler os dados em minhas estruturas de matriz, mas eu não posso controlar quantos ele lê. Ele irá ler todas as 14 entradas no arquivo de entrada, mas depois de ter lido a 14 continua para algumas linhas depois pára. No entanto, se eu colocar o código para ler os dados dentro de qualquer laço se tempo ou para, ele começa a imprimir grandes números em vez do que está contido no arquivo. Alguém sabe por que isso acontece? Existe uma maneira de contornar isso

arquivo de entrada tem o seguinte aspecto (exclui a ponto): Há 14 conjuntos de dados no arquivo. Então, como mostrado abaixo, jogo 1 incluiria Georgia 76,4 10, em seguida, north carolina 95,5 20, e assim por diante até 14 sets.

Dados dentro de arquivo de entrada se parece com isso:

georgia
76.4 10
north carolina
95.5 20
and so on.

Precisa imprimir dados para a tela como:

georgia 76.4 10
north carolina 95.5 20
etc.

O problema reside no meu código foram i tentar e horrivelmente deixar de ler no arquivo de entrada.

#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;
    }
}

Peço desculpas por todas as informações tentar ser tão claro como pode ser tão para não olhar mais idiota. Obrigado, tenha um bom dia.

Publicado 23/04/2014 em 20:36
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

getline()leva um ostream&e uma string. Desde seus tipos não são string, dá-lhe um erro. Eu recomendo a leitura em sua entrada como esta:

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

BTW, o seu stateé um char, que é um personagem. Torná-lo um std::string.

Respondeu 23/04/2014 em 20:39
fonte usuário

votos
0

A melhor maneira de obter uma linha inteira é usar std::getline. No entanto, se você tentar misturar entrada não formatado com entrada formatada então fica um pouco complicado. Você precisa lotes de ignorechamadas e outro disparate. Eu acho que é sempre mais clara para ler uma linha inteira de uma vez, e então usar um stringstream para analisar essa linha.

Tente isto:

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;
}

Chamá-lo com:

size_t num_items = readData(input, data, sizeof data / sizeof data[0]);
Respondeu 24/04/2014 em 02:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more