C -> segmentation fault inaspettata

di
Anonimizzato4824
il
2 risposte

C -> segmentation fault inaspettata

Ciao a tutti, premetto che sono nuovo a c, quindi il mio stile di programmazione magari non sarà il top.
Comunque ho un progetto da presentare all'uni, che consiste nel riscrivere il comando split di linux con alcune delle sue opzioni in c. Finora quello che ho prodotto è questo:

#include <stdio.h>
#include <stdlib.h>

main () {

FILE *input, *output;
char* fs_output;
char c, udm='c';
int k, n, i, temp;

input=fopen("casbraf", "r");
k=1000;
n=0;

while (1 && c!=EOF) {

	sprintf(fs_output, "output%d", n);	
	output = fopen (fs_output, "w");

	for (i=0; i<k && c!= EOF; i++){
		c=' ';
		if (udm == 'c') {
		
			c=fgetc(input);
			if ( c == EOF ) break;	
			c=fputc(c, output);
	
		} else {

			while (c != '\n'){
				c=fgetc(input);
				if ( c == EOF ) break;	
				c=fputc(c, output);
			}

		}
	
	}

	temp=fclose(output);
	n++;

}

n=fclose(input);


}

gcc compila senza problemi, ma all'esecuzione mi da segmentation fault sulla fgetc...

non riesco a darne fuori, ogni aiuto sarebbe gradito, soprattutto se tempestivo.
grazie.

2 Risposte

  • Re: C -> segmentation fault inaspettata

    Ciao, nel codice ci sono cose che non vanno. Ad esempio la funzione fgetc() ritorna un int e non un char. Oppure la funzione fputc ritorna un int e poi come parametri devi passargli lo stesso un int e un * a FILE. Questo valore int è il corrispondente codice codice ascii del carattere che vuoi scrivere o leggere nel caso della fgetc.
    Il valore che ritorna la fputc è lo stesso che gli hai passato come parametro se la funzione è andata a buon fine altrimenti ritorna EOF.
    Poi un altra cosa che non riesco a capire è l'uso della variabile udm.
    Un altra cosa...
    char *fs_output;
    è un puntatore a char che non punta mai a niente. Bisogna fare la new oppure crei un vettore:
    char fs_output[256];
    in questo modo puoi benissimo fare una sprintf(fs_output,"output%d",n);
    comunque il codice può essere più semplice:
    
    #include <stdio.h>
    
    int main(){
    
    FILE *input, *output;
    char fs_output[126]={'\0'};
    int carattere;
    int k, n, i;
    
    input=fopen("prova.txt", "r");
    k=100;
    n=0;
    
    while (!feof(input)) {
    
       sprintf(fs_output, "/files/output%d", n);   
       output = fopen (fs_output, "w");
    
       for (i=0; i<k && (carattere=fgetc(input)!= EOF); i++){
             fputc(carattere, output);
       }
    
       fclose(output);
       n++;
    
    }
    
    fclose(input);
    return 0;
    }
    
    
    
    ciao.
  • Re: C -> segmentation fault inaspettata

    Si il codice era parecchio incasinato perchè stavo *provando* a farlo funzionare.
    Comunque ho riscritto il codice da capo pulendolo parecchio e ora funzia.
    Giusto per la cronaca udm sta per unità_di_misura. va presa in input ma per il momento la assegnavo a mano. serve a stabilire se dividere il file per righe o per byte.
    Scusate un'altra cosa: è possibile leggere un intero dallo stdin senza far inserire l'EOF con ctrl+D?

    grazie.

    edit: come non detto, risolto.
Devi accedere o registrarti per scrivere nel forum
2 risposte