Rilevare newline byte da filestream

Sto cercando di raccogliere informazioni da un file di testo che contiene i nomi delle organizzazioni (senza spazi) e galleggiante interi. Voglio memorizzare queste informazioni in un array.

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

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 ogni organizzazione, e fino a 200 organizzazioni in textfile.

Questo è ciò che la mia struttura sembra così lontano:

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

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 realizzare nella mia funzione getdata è questo: memorizzare il nome dell’organizzazione prima nella struttura, per poi leggere ogni galleggiano nell’array dei dati fino a quando il programma rileva un newline byte. Tuttavia, finora il mio controllo per il newline byte non funziona.

Si supponga che le variabili c e MAX sono già definiti.

Come devo fare questo correttamente?

InformationsquelleAutor | 2009-03-13



4 Replies
  1. 2
    char byte = ins.peek();

    O

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

    (Modifica): Ti consigliamo di verificare anche per un eof dopo il peek(), perché alcuni file potrebbero non avere un finale newline.

    Vorrei sottolineare che si potrebbe desiderare di considerare l’utilizzo di un vector<callCentre> invece di un array statico. Se il file di input di lunghezza supera la capacità dell’array, avrete a piedi tutto lo stack.

    • Questo ha fatto esattamente quello che volevo. Grazie.
  2. 3

    Il >> l’operatore considera spazio come delimitatore, e che comprende i ritorni a capo, così si mangia solo a quelli e non li vedi.

    • Non è vero, si mangia tutto fino a che il carattere di spaziatura, la prossima volta, successivamente, quando si chiama, si occuperà di saltare il carattere di spaziatura fino a quando non raggiunge un altro carattere di spazio. “ciao” Si tradurrà in ciao di essere mangiato, e “c’è” ancora sta intorno.
    • Cont. utilizzando .peek() è possibile controllare ciò che il carattere successivo in linea.
    • con “mangia” intendevo che sono stati ignorati e non si arriva a vedere. Due usi del >> on “ciao \n” risultati “ciao a tutti” e “di là”, giusto?
  3. 3

    È necessario leggere le linee e tagliare le linee. I seguenti bit di hackery 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;
        }
    }
    • Ho provato applicazione del presente. Buona idea comunque.
  4. 2

    Vorrei leggere il file, una riga dopo l’altra e analizzare ogni singola riga 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++;
    }

Lascia un commento