Duvida em C

MoLt1eS

Power Member
Boas, estou a desenvolver um programa para ler varios numeros de um ficheiro, meter num array e ordenar.

Acontece que estou com problemas na parte de ler o ficheiro, aparece sempre o erro Segmentation fault.

Código:
    int nElem,i,temp; 
    FILE *ptfich; 
   
   
    /*validacao do ficheiro*/   
    if((ptfich = fopen(argv[1],"r"))==NULL) 
    fprintf (stderr, "O ficheiro %s não existe\n", argv[1]); 
     
     
    /**********************************************************/ 
 
    /*leitura da dimensao do ficheiro*/ 
     
    while(fscanf (ptfich, "%d", &temp) == 1) 
    nElem++; 
     
    printf(" \nNUMERO ELEM: %d ", nElem); 
    
    /*Criacao dos arrays*/ 
    int* array_a = calloc(sizeof(int),nElem); /*Array a - para usar no Insertion Sort*/ 
    int* array_b = calloc(sizeof(int),nElem); /*Array b - para usar no Merge Sort*/ 
    

    /*Preencher os arrays com os valores do ficheiro*/ 
    for (i = 0; i < nElem; i++){ 
    fscanf (ptfich, "%d", &array_a[i]); 
    array_b[i]=array_a[i];
    } 
    
    fclose (ptfich);

O erro ocorre na parte da leitura da dimensao do ficheiro.
Qual é o erro que estou a cometer?


Cumps,
MoLt1eS
 
"On success, the function returns the number of items successfully read. This count can match the expected number of readings or be less -even zero- in the case of a matching failure.
In the case of an input failure before any data could be successfully read, EOF is returned."

Eu acho que o que está a acontecer é que se tiveres 23 p.e. ele retorna 2 e não 1 e acaba o teu while.
Tenta fazer isso com um "!= 0" para ver se só para com o EOF.

cumps e boa sorte.
 
Eu acho que o que está a acontecer é que se tiveres 23 p.e. ele retorna 2 e não 1 e acaba o teu while.
Tenta fazer isso com um "!= 0" para ver se só para com o EOF.

cumps e boa sorte.

Bem agora não deu o erro mas esta a ler mal os numeros visto que sao listas de 10000 numeros em que pode conter 0's ele pode parar num 0 ou msm arrebentar visto que sao numeros bem grandes :P


a lista esta neste formato:
Código:
   212850028
   451231347
   189695537
   239757231
   171096576
   475896798
     8365964
   313580494
    85560229
   206005527
   370979491
    31599583
   483104746
    87802908
    85400712
   286186432
   324346867

eu cheguei por a condiçao while(fscanf (ptfich, "%d\n", &temp) == EOF)
mas da-me segmentation fault
 
Então fazes fscanf para ler a dimensão do ficheiro e depois não a usas? Estás a guardar na variável temp e devias guardar na variável nElem, pelo que percebi.
E como disseram: estás a usar o nElem sem o teres "inicializado" devidamente.


O meu conselho: compila o programa com a flag -g ou -ggdb e corre depois o programa usando a ferramenta valgrind, que te indica exactamente qual foi a linha/função que originou a geração de um Segmentation fault (Sinal 11 - SIGSEGV) e, quase mais importante ainda, indica-te onde estás a usar valores não inicializados para operações.

Exemplo:

$ gcc programa.c -o programa -ggdb

$ valgrind --leak-check=full ./programa

Cumps
 
Back
Topo