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

    C++ Lettura di un file particolare

    Salve.
    Ho un problema nel leggere un file particolare, strutturato cosi

    [100][200] Buongiorno


    Devo leggere i due numeri e la stringa...ma non ne ho idea...
    Ho provato cosi

    codice:
    FILE *file;
    fopen (file,"r");
    
    while not (file->eof) [
    E poi qui mi blocco, non so estrapolare i dati.
    Mi aiutate?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No ... non va ... prova ad analizzare questo semplice codice

    #include <stdio.h>

    int main()
    {
    FILE *file;

    file = fopen("C:\\prova.txt","r");

    int v1, v2;
    char s[201];

    while (fscanf(file, "[%d][%d] %200s\n", &v1, &v2, s))
    printf("Riga letta ... %d %d %s %d\n", v1, v2, s, feof(file));

    fclose(file);

    return 0;
    }

  3. #3
    fscanf(file, "[%d][%d] %200s\n", &v1, &v2, s)
    In pratica

    //entri nel file e leggi
    //Memorizzi nelle variabili v1 e v2 i numeri
    //formattati con %d (ma le [] tra i formattatori a che servono?)
    //e poi...il %200 non lo capisco, poi \n sarebbe la fine del file
    Mi puoi spiegare meglio?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Le parentesi e' per indicare che esistono proprio questi caratteri in quella posizione nella riga da leggere ...

    Il 200 indica che la stringa (al massimo) sara' lunga 200 caratteri ... e' per evitare problemi di buffer overflow ...

    Ti consiglio sempre di leggere (in rete o su un manuale C qualsiasi ...) le specifiche delle funzioni di libreria C che vengono usate nel codice.

  5. #5
    Ho provato il tuo codice, e mi da strani errori che non sembrano ne di compilazione ne logici, ma nel file fscanf.c
    E cmq le parentesi sono { e non [...
    Non ho manco capito il tuo codice, altrimenti lo modificavo.
    Non riesco a capire in base a cosa imposti il ciclo while
    Non vedo una condizione, e manco le { } che delimitano il codice.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da XVincentX
    Ho provato il tuo codice, e mi da strani errori che non sembrano ne di compilazione ne logici, ma nel file fscanf.c
    Devi essere piu' preciso ... di quali errori stai parlando?
    Il programma l'hai provato? Funziona?

    E cmq le parentesi sono { e non [...
    Cioe' ? Di quali parentesi stai parlando?

    Non ho manco capito il tuo codice, altrimenti lo modificavo.
    Questo non e' un problema ... dimmi cosa non capisci ...

    Non riesco a capire in base a cosa imposti il ciclo while
    Non vedo una condizione, e manco le { } che delimitano il codice.
    E manco il wend...
    La condizione del ciclo while si basa sul risultato fornito dalla fscanf. Ti ricordo che questa e' una funzione e quindi restituisce un valore che viene considerato come "condizione" del ciclo while.
    In particolare, la funzione restituisce 0 se non e' riuscita ad elaborare in input nessun campo, altrimenti restituisce il numero di campi elaborati in input. Il valore diverso da zero indica che il ciclo deve essere ripetuto perche' viene considerato come valore logico True, mentre il valore zero, viene considerato come valore logico False e il ciclo termina.

    Le { } che delimitano il codice del ciclo non ci sono semplicemente perche' il ciclo e' costituito solamente dall'unica linea printf.
    Il ciclo si aspetta una sola linea da ripetere (o un solo blocco). In questo caso, non c'e' il blocco perche' la linea da ripetere e' una sola.

    La clausola wend non esiste in C. Forse ti stai confondendo con un altro linguaggio.

    Forse e' meglio che fai le prove tenendo sottomano un libro base sulla programmazione C, perche' alcuni concetti di base li dovresti avere molto ben presenti prima di affrontare i problemi di programmazione con tale linguaggio ...

  7. #7
    No oggi sono un po fuso, non mi confondo ma cosi tanto.
    Non esiste un equivalente in C++? Io di C non capisco molto, non le conosco le funzioni, i formattatori...
    Ho comunque modificato il codice cosi

    codice:
    FILE *file; 
                   file = fopen("C:\\sottotitoli.sub","r"); 
                   int v1, v2; 
                   char s[1000000]; 
                   while (!feof(file))
                   {
                   fscanf(file, "{%d}{%d} %s\n", &v1, &v2, s); 
                   printf("Riga letta   %d %d %s %d\n", v1, v2, s,
               feof(file));
    Funziona, ma legge la riga all'infito!!
    In effetti stiamo facendo un lettore multimediale, e ora vogliamo aggiungere il supporto dei sottotitoli, che sono strutturati cosi
    {frameinizio}{framefinale} testo da scrivere...grazie mille

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    prova così:
    codice:
    #include <stdio.h>
    
    int main()
    {
    	FILE *file; 
    	file = fopen("sott.txt","r"); 
        int v1, v2; 
        char s[100]; 
        while (fscanf(file, "{%d}{%d} %[^\n]\n", &v1, &v2, s) != -1)
        {
    	    printf("%d %d %s\n", v1, v2, s);
        }
    }
    oppure
    codice:
    #include <stdio.h>
    
    int main()
    {
    	FILE *file; 
    	file = fopen("sott.txt","r"); 
        int v1, v2; 
        char s[100]; 
        while (!feof(file))
        {
    	    fscanf(file, "{%d}{%d} %[^\n]\n", &v1, &v2, s);
    	    printf("%d %d %s\n", v1, v2, s);
        }
    }
    l'errore era nella lettura della stringa...
    (inoltre fscanf restituisce -1 quando non legge)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La fscanf restituisce EOF (non usare -1 ma le costanti ...) in caso in cui il file termini ... Il codice corretto potrebbe essere

    while (fscanf(file, "{%d}{%d} %200s\n", &v1, &v2, s) != EOF)
    printf("Riga letta ... %d %d %s\n", v1, v2, s);

    Quello che ti avevo proposto, funziona regolarmente se il file di testo e' ben formato ...

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    oregon non funziona regolarmente se c'è qualke spazio...
    x questo ho messo %[^\n]\n nello scanf...

    se tipo hai una riga:
    {1}{1} Ciao come va?

    non funziona...

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