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

    [C] problemi fscanf

    Salve a tutti, sono nuovo del forum..
    Vi scrivo per chiedere chiarimenti su un pezzo di codice che il compilatore mi segna come "segmentation fault".
    premetto che sono obbligato ad utilizzare il compilatore cygwin
    il file da cui vado a leggere è composto da un centinaio di parole divise tra loro da un numero ogni volta diverso di spazi.

    utilizzo la fscanf per velocizzare l'esecuzione visto che con la fgetc il tempo di esecuzione cresce notevolmente.

    ogni parola trovata andrà poi salvata su un altro file.


    potreste aiutarmi a capire il mio errore? ve ne sarei molto grato!

    credo che il problema dovrebbe essere nel ciclo while.
    Grazie a tutti in anticipo


    codice:
    #include <stdio.h>		//Direttive al pre processore che ci permettono di includere
    #include <string.h>		//gli haeder file,relativi a librerie standar.
    #include <stdlib.h>
    #include <limits.h>
    #include <assert.h>
    
    
    
    						
    int main(int argc, char *argv[])
    {
    		char *nomeDelFile;						//puntatore al nome del file da comprimere o decomprimere
    		char *centoParole;	
    		char *stampa;
    		char *pra;
    		FILE *fileTesto;
    		FILE *fpw ;
    		
    		
    		if(argc!=2)								//controllo sul numero di parametri per far partire il programma che devono essere: <nome programma> <nome file>
    		{							
    			printf("\nErrore!Indicare il nome del file da comprimere o da decomprimere\n");
    			exit(1);
    		}	
    		
    		nomeDelFile=argv[1];					//copio il contenuto di argv[1] che contiene il nome del file da comprimere/decomprimere
    		
    		
    	centoParole = (char*)malloc(sizeof(char)*(strlen(nomeDelFile)+7));	
    	strncpy(centoParole,nomeDelFile,strlen(nomeDelFile));										
    	strncat(centoParole,".world\0",7);		
    	
    	
    
    	
    	fileTesto=fopen(nomeDelFile,"r");							//apertura del file di testo in modalità lettura
    		
    	fpw=fopen(centoParole,"w");									//apertura del file di testa in cui devo andare a scrivere
    	
    	
    	fflush(stdout);
    		
    	while(!feof(fileTesto))
    	{			
    			//QUI IL COMPILATORE VA IN SEGMENTATION FAULT
    			fscanf(fileTesto,"%s", pra);		
    			
    			
    			printf("\n Parola: %s \n", pra);
    			
    			stampa=(char*)malloc(sizeof(char)*(strlen(pra)));	
    			strncpy(stampa,pra,strlen(pra));			
    			
    			fprintf(fpw," %s \n",pra);			
    		
    	
    			
    	}
    	
    
    
    fclose(fileTesto);
    fclose(fpw);
    
    		return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C] problemi fscanf

    Originariamente inviato da giova87
    credo che il problema dovrebbe essere nel ciclo while.
    codice:
                   /* Azzerare sempre i puntatori per evitare casini */
    		char *nomeDelFile = NULL;						
     		char *centoParole= NULL;	
    		char *stampa= NULL;
    		char *pra= NULL;
    		FILE *fileTesto= NULL;
    		FILE *fpw = NULL;
    		
    		
    	while(!feof(fileTesto))
    	{			
    			//QUI IL COMPILATORE VA IN SEGMENTATION FAULT
                            // perché pra non ha spazio in cui accettare caratteri
                            // e fscanf non lo crea.
                            // Lo spazio va creato *prima* di usare fscanf e liberato
                            // quando non serve più.
                            pra = (char*) malloc( 256 * sizeof(char));
                            // brutale azzeramento del buffer.
                            memset(pra,0,256 * sizeof(char));
                            // lettura.
    			fscanf(fileTesto,"%s", pra);		
    			
                            /* resto del codice */			
    	                
                            // Qui non serve più.	
    	                free(pra);
    			
    	}
    	
    
    
    fclose(fileTesto);
    fclose(fpw);
    
    		return 0;
    }
    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.

  3. #3
    Innanzitutto GRAZIE MILLE! funziona perfettamente ora!

    però volevo chiederti due curiosità:

    1) perchè nella malloc di pra hai moltiplicato per 256?

    2) nel file .world che viene creato, le parole sono precedute e seguite da uno spazio, è possibile eliminarli o magari la fscanf funziona solo così?

    spero di essere stato chiaro nelle domande..

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    256 è arbitrario e indica la dimensione del buffer. Forse eccessivo (magari bastava 64), ma in C è meglio sovradimensionare i buffer di input, pena errori come quello che avevi.

    2) mai usato fscanf. Se faccio input da C (di solito uso C++) uso fgets e parserizzo i dati per i fatti miei.
    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.

  5. #5
    il problema degli spazi all'inizio e alla fine della parola l'ho risolto,non mi ero accorto che mettevo uno spazio prima e dopo il "%s".

    provando a moltiplicare per 64 mi sono accorto che qualche errore me lo dava,quindi ho preferito mantenere il 256 per stare sul sicuro!

    grazie ancora per la disponibilità!

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.