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

    [c] fscanf di una stringa enorme

    Salve, allora questo è il mio problema, questo programma mi calcola quante parole ci sono in un file, io devo prendere delle stringhe dal un file, fin che le stringhe sono di 100 caratteri è tutto ok, quando sono 100000 caratteri mi va in errore di memoria chiaramente, non deve avere una limitazione, se io metto char *riga, mi da errore, come posso fare.

    l'errore è EXC_BAD_ACCESS

    Ecco il codice :
    codice:
     int nParole (FILE* fp, int string_lenght)  //FUNZIONE PER IL CONTEGGIO DELLE PAROLE NEL FILE
     {
     int j=0;
     char *riga;
     
     for( ; ; )
     {
     if (fscanf(fp, "%s", riga) != EOF) 
     j++;
     else
     return j;
     }
     }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E' lo stesso problema riscontrato in questa discussione. "riga" è un semplice puntatore e non punta ad alcuno spazio allocato in memoria, ma ad un'area casuale. Quando vai a scriverci, evidentemente per pochi caratteri non hai un errore di accesso negato alla memoria ma quando questi diventano molti il problema emerge.

    Alloca dello spazio per "riga", staticamente o dinamicamente.
    every day above ground is a good one

  3. #3
    grazie per la risposta, ma che cosa alloco con la malloc se non so quanto è grande la parola??

    fammi un esempio

    non posso allora 1000 e se poi la parola è di 2000?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se c'è un limite massimo ti basta allocare tanto spazio quanto è tale limite, altrimenti puoi utilizzare un buffer di lunghezza fissa, leggere un tot di caratteri alla volta (es: 1000) e poi estrarre da quel buffer le parole... in sostanza, fare la stessa cosa che facevi prima ma senza leggere direttamente dal file. Dovresti gestire però il caso delle parole "tagliate" tra la fine del buffer in una lettura e l'inizio nella lettura successiva... altrimenti, come terza e ultima alternativa, puoi leggere tutto carattere per carattere direttamente dal file così anche se ti accorgi, durante la lettura, che la parola è molto lunga puoi riallocare spazio con la realloc()... insomma c'è un po' da "industriarsi", altrimenti prova a stabilire un limite di lunghezza massimo come ti suggerivo all'inizio e diventa tutto più semplice.
    every day above ground is a good one

  5. #5
    ho fatto cosi:

    codice:
    while(c!=' ')
    		{
    			c=fgetc(input);
    			caratteri++;
    		}
    		
    		caratteri--;
    		str=(char*)malloc(sizeof(char)*caratteri);
    		fscanf(in,"%s", str);
    ma da ancora errore EXC_BAD_ACCESS , i caratteri sono 1048576.

    in e input puntato allo stesso file, ma input serve per i caratteri e in per le stringhe.

    Come posso fare??

  6. #6
    risolto, mancava il carattere di terminazione '\0'

  7. #7
    ulteriore approfondimento :
    se avessi voluto leggere da un file .txt una stringa , un carattere e un numero , con la funzione fscanf , come avrei dovuto comportarmi
    mi spiego :

    fscanf elimina gli spazi (da quanto ho capito ) , per stringhe e interi , ma non per caratteri

    dunque

    ipotesi

    codice:
    typedef struct {
    char  nome [10] ;
    char sesso ;
    int annoDiNascita ;
    } persona ;
    
    
    .........
    persona persona [5] ;
    FILE *Ptr ;
    
    .........
    
    if ((Ptr = fopen ("persona.txt" , "r" ) ) != NULL )
    
    while ( !feof (Ptr ) ) 
    
    {
    
    fscanf ( Ptr , "%s" , persona[i].nome ) ;
    
    
    fscanf(Ptr , "%d" , &persona[i].annoDiNascita ) ; 
    
    i++ ;
    
    ....................................
    }
    allora in questo modo la fscanf legge anche gli spazi e dunque salta il carattere che mi interessa ("sesso")


    diversamente aggiungendo dentro il while madre in while nidificato

    codice:
    while ((ch = fgetc (Ptr) ) == ' ' ) ;   /*riga1*/
    persona[i].annoDiNascita = ch ;     /*riga 2 */
    
    fscanf (Ptr , %d\n" , &persona[i].annoDiNascita ) ;
    i++ ;
    ora non capisco in che modo le righe 1 e 2 possano eliminare gli spazi e leggere il carattere corretto ;
    qualcuno può darmi una delucidazione?


    grazie

  8. #8
    Originariamente inviato da toni00c

    codice:
    typedef struct {
    char  nome [10] ;
    char sesso ;
    int annoDiNascita ;
    } persona ;
    
    
    .........
    persona persona [5] ;
    FILE *Ptr ;
    
    .........
    
    if ((Ptr = fopen ("persona.txt" , "r" ) ) != NULL )
    
    while ( !feof (Ptr ) ) 
    
    {
    
    fscanf ( Ptr , "%s" , persona[i].nome ) ;
    
    
    fscanf(Ptr , "%d" , &persona[i].annoDiNascita ) ; 
    
    i++ ;
    
    ....................................
    }



    grazie
    Intanto, fare questa cosa comporta un problema. Il feof legge se il file è finito, ma se tu leggi dentro il while, se il file è finito, non se ne accorge, quindi dovresti scrivere così:

    codice:
    fscanf ( Ptr , "%s" , persona[i].nome ) ;
    while ( !feof (Ptr ) ) 
    
    {
    
    
    
    
    fscanf(Ptr , "%d" , &persona[i].annoDiNascita ) ; 
    fscanf ( Ptr , "%s" , persona[i].nome ) ;
    
    i++ ;
    
    ....................................
    }

  9. #9

    codice:
    while ((ch = fgetc (Ptr) ) == ' ' ) ;   /*riga1*/
    persona[i].annoDiNascita = ch ;     /*riga 2 */
    
    fscanf (Ptr , %d\n" , &persona[i].annoDiNascita ) ;
    i++ ;
    ora non capisco in che modo le righe 1 e 2 possano eliminare gli spazi e leggere il carattere corretto ;
    qualcuno può darmi una delucidazione?


    grazie
    In secondo luogo ti consiglio di strutturare il file di I/O in questo modo:

    codice:
    carlo
    1958
    luca
    1919
    ..........
    In questo modo leggi TUTTA la riga e non hai il problema degli spazi, poi se volevi risolvere la questione con la fscanf e con gli spazi allora poi vediamo XD

  10. #10
    hai ragione , errore di distrazione

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.