Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] Ma fseek è una funzione sicura?

    Ciao a tutti,
    ho cercato di usare la funzione fseek nel mio codice. Questo è il codice:
    codice:
    char sLine[3];
    FILE *fpt;
    if ((fpt = fopen("file.txt", "r")) == NULL) {
        printf("Coudln't access file.txt.\n");
        exit(0);
    }
    fseek(fpt, -2, SEEK_END);
        
    
    fgets(sLine, 3, fpt);
    ma gli ultimi due caratteri del file non sempre vengono trovati. Come mai?
    Grazie.

    P.S.
    Come mai non funzionano i form per fomattare il testo?
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    e chi ti dice che gli ultimi 3 caratteri non siano caratteri non-visibili?
    Per esempio, se usi windows e hai il carattere di ritorno a capo, che è due caratteri \r\n, più il terminatore di riga....
    io consiglierei di ciclare, dall'ultimo carattere, fino a quando non trova 2 caratteri visibili, o arriva all'inzio del file
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  3. #3
    Ciao Hysoka,
    grazie per la risposta. Sono un pò nuovo di c++ ma so cosa è un ciclazione. Ma non saprei però come farla. Io infatti non devo trovare un carattere, ma due caratteri consecutivi. Gli ultimi due.
    Mi potresti dare altri lumi?
    Ciao.
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    una cosa del genere

    una cosa del genere:

    codice:
    //blablabla
    FILE *fpt;
    fpt = fopen("path del mio file");
    int i = 0;
    char buf [1];
    char str [3];
    
    int count = 2;
    
    while(1)
        {
        i++;
        if(fseek(fpt, -i, SEEK_END))
            {
            cout << "Errore! file non valido o con meno di tre caratteri visibili";
          
            return 1;
            }
        fgets(buf, 1, fpt);
        if((buf[0] >= 32 && buf[0] <= 126) || buf [0] == '\n') //nel caso di ascii 128 bit, '\n' è un carattere visibile
            {
            str[count] = buf[0];
            count--;
            }
        if(count == 0)
            break;
        
    
        }
    fclose(fpt);
    cout << "ecco i tre ultimi caratteri visibili: "<<str;
    //fine programma
    
    
    //codice non testato ma dovrebbe andare :)

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    while(1)? Che orrore
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487
    Originariamente inviato da Alex'87
    while(1)? Che orrore
    assolutamente no! migliora la leggibilità e la portabilità è la stessa

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da kirakira93
    assolutamente no! migliora la leggibilità e la portabilità è la stessa
    Migliora la leggibilità un corno dato che per capire quando finisce quel ciclo bisogna leggersi tutto il blocco di codice. Hai mai sentito parlare di "buona programmazione"? while(1) e l'utilizzo del break per uscire dal ciclo non lo è nel modo più assoluto!

    Ad occhio quel ciclo potrebbe essere while (count > 0) {} :master:
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    si anche

    anche...ma allora bisognava mettere anche l'eccezione dela fseek()...per questo ho messo 2 break al posto di quello che hai messo te e un break

    Poi io penso che nella programmazione anche un goto o un __try __leave __finally possono benissimo essere usati....basta stare attenti

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: si anche

    Originariamente inviato da kirakira93
    anche...ma allora bisognava mettere anche l'eccezione dela fseek()...per questo ho messo 2 break al posto di quello che hai messo te e un break
    Mettere il controllo del valore di fseek nella condizione del while? E perché mai? Sai già quando uscire dal ciclo: quando count diventa zero. Il controllo del valore di ritorno della fseek è corretto farlo nel corpo del ciclo e l'eventuale errore non dovrebbe far parte della condizione di uscita in quanto si tratta di una situazione eccezionale. In questo caso sarebbe più corretto (a mio parere) far restituire un codice di errore e passare la patata bollente al chiamante (stampa dell'errore compresa).


    Originariamente inviato da kirakira93
    Poi io penso che nella programmazione anche un goto o un __try __leave __finally possono benissimo essere usati....basta stare attenti
    Il __try __leave __finally in C non lo conosco mami pare non sia un costrutto standard. Riguardo il goto...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Ciao a tutti,
    ho aperto io questo thread. Ringrazio tutti gli intervenuti. I vostri interventi saranno comunque utili ma io gli ultimi 2 caratteri non li trovavo semplicemente perchè non venivano sempre salvati, per errori nel codice.
    Ringrazio ancora tutti.
    Giorgio
    L'esperienza è il tipo di insegnante più difficile. Prima ti fa l'esame, e poi ti spiega la lezione. (Oscar Wilde)

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.