Domanda

Sto cercando di raccogliere informazioni da un file di testo che contiene nomi di organizzazioni (senza spazi) e numeri interi mobili. Voglio archiviare queste informazioni in una struttura array.

Il problema che sto riscontrando finora è la raccolta delle informazioni. Ecco un esempio del file di testo:

  

CBA 12.3 4.5 7.5 2.9 4.1

     

TLS 3.9 1 8.6 12.8 4.9

Posso avere fino a 128 numeri diversi per ciascuna organizzazione e fino a 200 organizzazioni nel file di testo.

Ecco come appare la mia struttura finora:

struct callCentre
{
char name[256];
float data[20];
};

Il mio principale:

int main()
{
callCentre aCentre[10];
getdata(aCentre);
calcdata(aCentre);
printdata(aCentre);
return 0;
}

E la funzione getdata:

void getdata(callCentre aCentre[])
{
ifstream ins;
char dataset[20];

cout << "Enter the name of the data file: ";
cin >> dataset;

ins.open(dataset);

if(ins.good())
{
    while(ins.good())
    {
        ins >> aCentre[c].name;
        for(int i = 0; i < MAX; i++)
        {
            ins >> aCentre[c].data[i];
            if(ins == '\n')
                break;
        }
        c++;
    }
}
else
{
    cout << "Data files couldnt be found." << endl;
}
ins.close();
}

Quello che sto cercando di ottenere nella mia funzione getdata è questo: memorizza prima il nome dell'organizzazione nella struttura, quindi leggi ogni float nell'array di dati fino a quando il programma non rileva un byte newline. Tuttavia, finora il mio controllo per il byte newline non funziona.

Supponiamo che le variabili c e MAX siano già definite.

Come devo procedere correttamente?

È stato utile?

Soluzione

char byte = ins.peek();

o

if(ins.peek() == '\n') break;

(Modifica): dopo la sbirciatina dovrai anche verificare la presenza di un eof (), poiché alcuni file potrebbero non avere una riga finale.

Vorrei sottolineare che potresti prendere in considerazione l'utilizzo di un vector<callCentre> invece di un array statico. Se la lunghezza del file di input supera la capacità dell'array, camminerai su tutto lo stack.

Altri suggerimenti

Il > > l'operatore considera gli spazi bianchi come un delimitatore e questo include le nuove righe, quindi ne mangia solo e non le vedi mai.

Devi leggere le righe e poi tritarle. Il seguente frammento di hacking illustra l'idea di base:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string line;
    while( getline( cin, line ) ) {
        istringstream is( line );
        string cs;
        is >> cs;
        double vals[10];
        int i = 0;
        while( is >> vals[i] ) {
            i++;
        }

        cout << "CS: " << cs;
        for ( int j = 0; j < i; j++ ) {
            cout << " " << vals[j];
        }
        cout << endl;
    }
}

Vorrei leggere il file, una riga dopo l'altra e analizzare ciascuna riga singolarmente per i valori:

std::string line;
while (std::getline(ins, line)) {
  std::istringstream sline(line);
  sline >> aCentre[c].name;
  int i = 0;
  while (sline >> aCentre[c].data[i])
    i++;
  c++;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top