1
I’m having a problem segmentation fault
in file opening txt
. I know for manipulating strings
, higher level liguagens, but I have no way to learn now, so I’m using C
. My problem is to read a list with name of four thousand files, whose format of each is the following:
0.00053714,0.00053714,-0.00061595,0.30794,-0.00061595,0.30794,1.0001,1,0.0050735
My program takes the element that corresponds to the position defined by the variable posição_elemento=6
, in that specific case equal to six.
The problem that’s occurring is that I can’t perform this operation of taking the sixth element in my four thousand files, occurring segmentation fault
. I think it’s some wrong parameter I’m passing to while (fgets(line, sizeof(line), arquivo2))
. Follow my code below:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void subs(char* buffer){
int i;
for(i = 0; i < strlen(buffer); i++){
if(buffer[i] == '\n')
buffer[i] = 0; // Contrabarra zero: fim do buffer
}
}
int main(){
FILE *lista, *lista_nova;
FILE *arquivo, *arquivo2;
char buffer[50];
char leia, line[256], *valor, *valor_escolhido;
int cont_elemento = 1, posicao_elemento=6, i=0;
float tempo;
lista_nova = fopen ("lista_nova.txt", "r");
arquivo = fopen("velocidades.txt", "wt");
if (arquivo == NULL){
printf ("Error opening velocidades\n");
return 0;
}
while( !feof(lista_nova) ){
fgets(buffer, 50, lista_nova);
subs(buffer);
arquivo2 = fopen(buffer, "r");
if (arquivo2 == NULL){
printf ("Error opening buffer.txt\n");
return 0;
}
printf ("Arquivo = %s\n", buffer);
while (fgets(line, sizeof(line), arquivo2))
{
//Pega o primeiro elemento separado por uma virgula.
valor = strtok(line,",");
//Obtem os outros elementos até o fim da linha.
while (valor != NULL)
{
//printf("%s\n",valor);
valor = strtok(NULL, ",");
cont_elemento++;
if (cont_elemento == posicao_elemento)
valor_escolhido = valor;
}
}
tempo=0.1*i;
fprintf(arquivo,"%f\t%s\n",tempo,valor_escolhido);
i++;
cont_elemento=1;
}
fclose(arquivo);
fclose(arquivo2);
fclose (lista_nova);
return(0);
}
To get the string
"0.00053714,0.00053714,-0.00061595,0.30794,-0.00061595,0.30794,1.0001,1,0.0050735"
an array of at least 82 bytes. With 50 bytesfgets()
reads the string twice: the first with 49 characters, the second with the rest including the'\n'
.– pmg
@pmg but these 50 are to read the name of the file that will be opened and not the string. The person responsible for reading it has 256.
– Túlio Alves
Ah! My mistake. One thing you must fix is the first cycle
while
. You should control the cycle with the result of the functionfgets()
(as you did for the inner cycle) instead of the function resultfeof()
.– pmg
Sorry @pmg but I don’t understand what you mean. Can I repeat please?
– Túlio Alves
while (!feof(...)) { /* ... */ }
this wrong: the correct way iswhile (fgets(...)) { /* ... */ }
. Functionfeof()
determines if the last error occurred is due to the end of the file; calling that function without previous error indicates causes extra file readings.– pmg
Thanks @pmg , already fixed but I still have the same problem of Segmentation fault, when it will open certain number of files. Currently it stops running the program, failing to open after file number 1016. When I run on another computer, the most I can open varies. I already got 560 and gave error, as well as 1200 in another and then error in the same way.
– Túlio Alves