Manipulação de arquivos

1. Manipulação de arquivos

Djalma L. O. Junior
Djalma_Jr

(usa Debian)

Enviado em 20/05/2013 - 16:45h

E ai pessoal, beleza? Estou fazendo um programinha aqui simples pra fazer conversão de unidades, mas está dando erro de segmentação quando eu tento rodar o programa, será que alguém pode me ajudar?
Valeu.

(Tem algumas coisa de Windows porque eu estava testando no meu outro computador também, mas da erro na hora de digitar o nome do arquivo de entrada, então não chega em nada do windows.)

/*Programa para conversão de KJ em Kcal
Autor: Djalma Lacerda de Oliveira Junior */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000

int cont;
float x[MAX], y[MAX], xk[MAX], yk[MAX];
char name_input[MAX], name_output[MAX];

void Leitura(){

int i;
FILE *input;

printf ("Este programa converte dados de KJ para KCal\n");

printf ("Entre com o nome do arquivo de entrada: \n");
fgets (name_input, MAX, stdin);

input = fopen (name_input, "r");

for (i = 0; i < MAX; i++){
fscanf (input, "%f", &x[i]);
fscanf (input, "%f", &y[i]);

if(y[i] == 0){
break;
}

cont = cont + 1;

}

fclose (input);

}


int Conversao(){
int i, n;

n = 0;

for (i = 0; i < cont - 1; i++){
yk[i] = (y[i] / 4.1868);

}

return 0;

}


int Impressao(){
int i;

printf ("Entre com o nome do arquivo de saida: \n");
fgets (name_output, MAX, stdin);

FILE *output;
output = fopen (name_output, "w");

for (i = 0; i < cont-1; i ++){
fprintf (output, "%f ", x[i]);
fprintf (output, "%f\n", yk[i]);

}

fclose (output);

return 0;

}


int main(){

Leitura();
Conversao();
Impressao();

printf ("Os dados foram convertidos com sucesso!\n");

system ("pause");
return 0;
}



  


2. Re: Manipulação de arquivos

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/05/2013 - 23:09h

Como você lê o nome do arquivo com fgets(), provavelmente o caráter de fim de linha está ficando no nome do arquivo. Com isso, é bem provável que a abertura do arquivo falhe, resultando num ponteiro nulo em input, o que explicaria plenamente o SIGSEGV.

Minhas sugestões são as seguintes:

* Continue usando fgets(), mas remova o '\n' do final da string, caso ele exista, por meio de uma função como a mostrada abaixo.

* Acostume-se, em C, a testar os valores devolvidos pelas funções que realizem operações que possam falhar. Arquivos podem não existir ou ter permissões que proíbam seu acesso, dados podem não estar no formato esperado, o computador pode ficar sem memória, a rede pode ficar inacessível, e muitos outros erros independentes da lógica do próprio programa podem ocorrer no momento da execução. Em muitos casos, a melhor resposta ao incidente pode ser mesmo fechar o programa, guardando certa semelhança com o que o SO fará caso se tente prosseguir com a execução após um erro, mas uma mensagem razoavelmente amigável para o usuário, de preferência com alguma dica acerca do contexto em que se deu o erro, é sempre melhor do que a simples interrupção de execução com uma mensagem genérica.

void chomp(char *str){
size_t len=strlen(str);
if(len>0 && str[len-1]=='\n')
str[len-1]=0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts