Visualizzazione dei risultati da 1 a 7 su 7

Discussione: fscanf (C/C++)

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    34

    fscanf (C/C++)

    Salve a tutti,
    devo leggere un file in cui ho una riga di questo tipo

    <nome> <numero> <nome1> <nome2> ... <nome numero>

    quindi tanti nomi dopo il numero quanto vale il numero

    pensavo di poter fare così:

    while (!feof(fin))
    {
    fscanf(fin, "%s %d", nome, numero);

    for (int i=0; i < numero; i++)
    {
    fscanf(fin, "%s", nome);
    ....
    ....
    }
    fscanf(fin, "\n"); //fine riga
    }

    Che ne dite, potrebbe funzionare?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Hai provato almeno???
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    34
    Non ne ho la possibilità: il programma devo scriverlo su carta!

  4. #4
    Originariamente inviato da Vik27
    Non ne ho la possibilità: il programma devo scriverlo su carta!
    :master:
    ... be', puoi sempre scriverlo sul PC, compilarlo, verificare se va e alla fine stamparlo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    34
    Beh, mi sa che 'stasera devo provare

  6. #6
    Comunque:
    codice:
    fscanf(fin, "%s %d", nome, &numero);
    Nel ciclo immediatamente successivo stai andando a rileggere continuamente il nome nella stessa variabile; probabilmente è voluto, ma nel dubbio te lo segnalo.

    Inoltre dovresti sempre verificare che il valore restituito da fscanf sia uguale al numero di campi che stai leggendo, in caso contrario si è verificato un errore di lettura e dovresti interrompere la lettura segnalando il problema all'utente.

    L'fscanf finale è inutile, fscanf si "mangia" da sola i whitespace, e \n rientra in ciò che è considerato whitespace (come spiegato nella sua documentazione).

    Tutte le volte che leggi una stringa vedo che non limiti l'input alle dimensioni del buffer: è una potenziale vulnerabilità di sicurezza e può facilmente mandare in crash il tuo programma se il file contiene stringhe più lunghe della dimensione del buffer (se ti va bene, altrimenti il programma non va in crash ma inizia a fare cose senza senso perché hai sovrascritto parti di stack che non c'entrano nulla).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    34
    Grazie, pensavo che la scanf avesso bisogno della \n per terminare.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.