Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [c] lettura stringhe da file

    Salve a tutti... sono nuovo di qui ed ho appena iniziato a programmare.
    ho un problemino con un programma che sto creando, il programma dovrebbe gestire una elenco di automobili e ogni auto è composta dalle voci marca, modello, cilindrata, anno.

    fin qui tutto bene ma c'è un problema nella parte del codice che carica la lista di auto da un file esterno

    ecco qui il codice:

    for(int i=0; i<4; i++) {
    fgets(stringa, 35, load);
    printf("%s", stringa);
    strncpy(macchina[i].marca, (strtok(stringa, "|")), 20);
    strncpy(macchina[i].modello, (strtok(NULL, "|")), 20);
    strncpy(macchina[i].cilindrata, (strtok(NULL, "|")), 4);
    printf("%s\n", macchina[i].cilindrata);
    strncpy(macchina[i].anno, (strtok(NULL, "|")), 4);
    }
    questo è il contenuto del file:
    Fiat|Panda|1300|2008
    Fiat|Palio|1100|1999
    Nissan|Skyline|2500|1998
    Lamborghini|Gallardo|3500|2007
    praticamente quando eseguo il programma l'output su schermo è questo:
    Fiat|Panda|1300|2008
    1300?
    Fiat|Palio|1100|1999
    1100???
    Nissan|Skyline|2500|1998
    2500
    Lamborghini|Gallardo|3500|20073500-??????
    NB i punti di domanda sono caratteri casuali

    se poi scelgo di visualizzare l'intera lista di auto appare una roba del genere
    Marca: Fiat
    Modello: Panda
    Cilindrata: 13002008Fiat
    Anno: 2008Fiat
    e cosi via per tutte le auto... perchè???

    PS se serve posso postare l'intero codice ma sono più di 100 righe

  2. #2
    forse anche si deve cerinare i line breaks?

    è "\n"

    Ciao,
    Dennis M.
    Nuovo Blog di Programmazione! (Lo ha i tutti tipi! PHP e C/C++)
    Per piacere lo supporti!

  3. #3
    Originariamente inviato da DennisM
    forse anche si deve cerinare i line breaks?

    è "\n"
    potresti spiegarti meglio... sono ancora niubbo in queste cose.

    \n li metto sempre nei printf che visualizzano la lista di auto

  4. #4
    Allora ho fatto delle prove... i caratteri strani che appaiono forse è solo perchè in quella parte di codice deve ancora essere eseguito ill fflush e fclose.
    però resta il fatto che quando visualizzo la lista delle auto:

    for(;pro<=5;pro++) {
    printf("\n----------------------------");
    printf("\n|### AUTO %d ###", pro);
    printf("\n|");
    printf("\n|marca auto: %s", macchina[pro].marca);
    printf("\n|modello auto: %s", macchina[pro].modello);
    printf("\n|cilindrata auto: %s", macchina[pro].cilindrata);
    printf("\n|anno di immatricolazione: %s", macchina[pro].anno);
    }
    nel printf che visualizza la cilindrata stampa a video la scritta "cilindrata auto:" e come valore non mette solo cilindrata ma anche anno e nome e non riesco a capire il perchè...

  5. #5
    Up.. vi prego... non riesco a capire dove sto sbagliando!

  6. #6
    no il problema è proprio nelgli Strtok... non riescono a separare bene gli ultimi due valori....
    AIUTO!!!!!

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non ti viene il dubbio di star copiando troppi caratteri con la strncpy?
    La strtok restituisce una stringa null terminated, quindi corretto sarebbe:
    codice:
    for(int i=0; i<4; i++) {
       fgets(stringa, 35, load);
       printf("%s", stringa);
       char* tmp = strtok(stringa, "|");
       strncpy(macchina[i].marca, p, strlen(p));
    
       tmp = strtok(NULL, "|");
       strncpy(macchina[i].modello, p, strlen(p));
       etc...
    }
    Tieni presente che la fgets si ferma se trova un \n, ma tale carattere è considerato valido e lasciato nella stringa.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Originariamente inviato da shodan
    Non ti viene il dubbio di star copiando troppi caratteri con la strncpy?
    La strtok restituisce una stringa null terminated, quindi corretto sarebbe:
    codice:
    for(int i=0; i<4; i++) {
       fgets(stringa, 35, load);
       printf("%s", stringa);
       char* tmp = strtok(stringa, "|");
       strncpy(macchina[i].marca, p, strlen(p));
    
       tmp = strtok(NULL, "|");
       strncpy(macchina[i].modello, p, strlen(p));
       etc...
    }
    Tieni presente che la fgets si ferma se trova un \n, ma tale carattere è considerato valido e lasciato nella stringa.
    ho provato ma non si è risolto nulla... copia caratteri in più del normale... nonostante ad esemio macchina[1].anno possa contenere max 4 lettere lui ne salva di più fregandosene anche dello strlen....

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Modifica con:
    codice:
    strncpy(macchina[i].marca, p, strlen(p)+1);
    per far copiare il carattere NULL, che servira alla printf per stampare a video.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Originariamente inviato da shodan
    Modifica con:
    codice:
    strncpy(macchina[i].marca, p, strlen(p)+1);
    per far copiare il carattere NULL, che servira alla printf per stampare a video.
    OK ora i vari token vengono creati correttamente... rimane solo un problema.
    quando visualizzo la lista delle auto succede questo

    Marca Auto: Fiat
    Modello Auto: Panda
    Cilindrata Auto: 13002008Fiat
    Anno: 2008Fiat

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.