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