Domanda sulla lettura di Alcuni valori da un file

di il
5 risposte

Domanda sulla lettura di Alcuni valori da un file

Salve ragazzi/e, buonasera a tutti.
Sono nuovo, quindi spero di star postando nella sezione giusta, altrimenti scusatemi.

Volevo chiedervi una mano riguardo un algoritmo che devo sviluppare in c++, ma che mi sta dando molti grattacapi riguardo la lettura di valori da un file.
Il problema è semplicemente il modo in cui i caratteri sono disposti nel file. Vi faccio subito un esempio:

Ho un file di circa 80 righe, e in ognuna di queste vi sono un valore intero e una string, separati da una virgola, e delimitati da un < e un >, ovvero in questo modo:

<INTERO,STRINGA>
( <521,oER2j01wCt> )
Ora, dovendo leggere da file, sono consapevole che sono entrambi letti come string, e che quindi per leggere effettivamente il valore intero debba trasformarlo ecc, ma il mio problema è proprio come leggere solo il valore intero, "eliminando" quindi sia il < che la virgola, da ciascuna riga.
So che la getline può darmi una mano, ma non penso che riesca ad eliminare sia la virgola che il < che poi anche il > alla fine (anche se potrei eliminarlo in seguito dalla string).

Dunque, se qualcuno potesse darmi una spiegazione su come si possa fare, gliene sarei davvero grato, dato che ci sto sbattendo la testa da vari giorni. Grazie mille!

5 Risposte

  • Re: Domanda sulla lettura di Alcuni valori da un file

    Ma quelle parentesi tonde ci sono o no?

    E il simbolo < è sempre il primo carattere della riga?
    Dal secondo carattere comincia il numero?

    Prova con
    
        int vnum;
    
        FILE* fr = fopen((char *)"dati.txt", "r");
    
        while (fscanf(fr, "%*c%d%*c%*s%*c", &vnum) == 1)
            printf("%d\n", vnum);
    
        fclose(fr);
        
  • Re: Domanda sulla lettura di Alcuni valori da un file

    oregon ha scritto:


    Ma quelle parentesi tonde ci sono o no?

    E il simbolo < è sempre il primo carattere della riga?
    Dal secondo carattere comincia il numero?

    Prova con
    
        int vnum;
    
        FILE* fr = fopen((char *)"dati.txt", "r");
    
        while (fscanf(fr, "%*c%d%*c%*s%*c", &vnum) == 1)
            printf("%d\n", vnum);
    
        fclose(fr);
        
    Ciao, e grazie per aver risposto.
    Innanzitutto vorrei chiarire una cosa: Il codice è in C++, quindi niente scanf eccetera per fortuna.
    No, le parentesi tonde non ci sono nel file: è strutturato in questo modo:
    char int char string char, ovvero: < int , string >.
    Sì, simbolo < è sempre il primo della riga. purtroppo so che con la getline si può rimuovere solo un char (ad es il minore, o la virgola, o il maggiore). Detto questo, devo sia leggere gli int, che le string, quindi farei una cosa del genere:
    
    fstream file("nomefile.txt");
    string line;
    while(getline(file,line,'<')){
         //Lettura ecc
    }
    
    Ma dopo questo, come posso "dividere" la string dagli int? Magari un strtok?
    Grazie ancora per la risposta, spero di star pensando bene
  • Re: Domanda sulla lettura di Alcuni valori da un file

    Scanf no che fa troppo C, e strtok invece sì?
    A sto punto fallo senza funzioni e fai la conversione diretta
  • Re: Domanda sulla lettura di Alcuni valori da un file

    Weierstrass ha scritto:


    Scanf no che fa troppo C, e strtok invece sì?
    A sto punto fallo senza funzioni e fai la conversione diretta
    Non voglio "negare" a prescindere una function. Se c'è cin/cout uso quelli invece della scanf, sono più convenienti. Mentre per quanto riguarda strtok, al momento non mi viene in mente un'altra function che faccia lo stesso, quindi se non ce ne fossero, andrei per quella, altrimenti userei altre. Tutto il punto è, preferisco usare function che conosco, con cui mi trovo a mio agio e che so come si comportano quasi al 100%, non perchè " fanno troppo C".
    Invece, per quanto riguarda la conversione diretta, ammetto di non sapere cosa sia. Intendi il fare:
     int a = (int) charLetto 
    ?
  • Re: Domanda sulla lettura di Alcuni valori da un file

    Potresti fare così
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(){
        string s = "<521,oER2j01wCt>";
        int i = 0, n = 0;
        bool neg = false;
        while(s[i] != '<')
            i++;    
        i++;
        while(s[i] == ' ')
            i++;
        if(s[i] == '-'){
            neg = true;
            i++;
        }
        while(s[i] >= '0' && s[i] <= '9'){
            n *= 10;
            n += s[i] - '0';
            i++;
        }
        if(neg)
            n = -n;
        cout << n;
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
5 risposte