Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ori

Conflito na utilização de lista encadeada e leitura de arquivo .txt co

Recommended Posts

O código abaixo lê um arquivo texto, palavra por palavra (fsanf()), e imprime o resultado na tela. Reparem na variável _gambi_[9], um vetor de char. Ela nem é utilizada pelo programa, mas quando comento ou excluo ela o programa não funciona, mostra um conjunto de caracteres aleatórios no lugar das palavras.

/*
Autoria: Johnson Sudré
Data...: 08/06/2015
*
Função: Lê um arquivo texto palavra por palavra dinâmicamente e imprime o resultado na tela.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lista.h"

int main(void) {
    FILE *arq;
    char _gambi_[9];
    char *p_aux;
    arq = fopen("./texto.txt", "r");
    printf("\n\n");
    if (arq == NULL)
    {
        printf("Erro, nao foi possivel abrir o arquivo\n");
        return(1);
    }
    while((fscanf(arq, "%s", p_aux))!= EOF)
    {
        printf("%s ", p_aux);
    }
    rewind(arq);
    printf("\n\n\n      Tam  |  String");
    printf("\n-----------+-------------");
    while((fscanf(arq, "%s", p_aux))!= EOF)
    {
        printf("\n%10d | %s ", strlen(p_aux), p_aux);
    }
    fclose(arq);
    return 0;
}

O código abaixo era pra ser a evolução do código anterior, e sua função é ler as palavras do arquivo texto e inseri-las numa lista encadeada.

/*
Autoria: Johnson Sudré
Data...: 08/06/2015
*
Função: Lê um arquivo texto palavra por palavra dinâmicamente e imprime o resultado na tela.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lista.h"

int main(void) {
    FILE *arq;
    Lista *l;
    char _gambi_[9];
    char *p_aux;
    l=listaIni();
    arq = fopen("./texto.txt", "r");
    printf("\n\n");
    if (arq == NULL)
    {
        printf("Erro, nao foi possivel abrir o arquivo\n");
        return(1);
    }
    while((fscanf(arq, "%s", p_aux))!= EOF)
    {
        printf("%s ", p_aux);
    }
    fclose(arq);
    return 0;
}

O problema:
o programa pára quando inicio a lista (l=listaIni();) e logo em seguida leio o arquivo. Quando só leio o arquivo dá certo. Quando só crio e manipulo uma lista, também roda. Porém, quando crio uma lista vazia ao ler o arquivo o programa trava.

PS.: Gente desculpem a minha tosquice mas como faço pra anexar alguns arquivos? Preciso anexar a biblioteca lista (.h e .c) e mais dois arquivos, um que contém o texto (texto.txt) e outro (teste_lista.c) que testa a biblioteca para lista encadeada, que utilizei para ver se o erro está na biblioteca (pelo jeito não está, pois o código tá funfando). Tem como anexar pessoal? obs.: pelo botão "minha mídia" não rolou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo visto funcionou normalmente pra mim.

 

 


isis@linux:~/src/imasters> gcc-5 -Wall -Wextra -std=c11 leitura.c
leitura.c: In function ‘main’:
leitura.c:7:10: warning: unused variable ‘_gambi_’ [-Wunused-variable]
char _gambi_[9];
^
leitura.c:17:9: warning: ‘p_aux’ may be used uninitialized in this function [-Wmaybe-uninitialized]
printf("%s ", p_aux);
^
isis@linux:~/src/imasters> ./a.out
linha 1 linha 2
Tam | String
-----------+-------------
5 | linha
1 | 1
5 | linha
1 | 2
isis@linux:~/src/imasters> gcc-5 -Wall -Wextra -std=c11 leitura.c
leitura.c: In function ‘main’:
leitura.c:17:9: warning: ‘p_aux’ may be used uninitialized in this function [-Wmaybe-uninitialized]
printf("%s ", p_aux);
^
isis@linux:~/src/imasters> ./a.out
linha 1 linha 2
Tam | String
-----------+-------------
5 | linha
1 | 1
5 | linha
1 | 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

_Isis_, o primeiro código funciona, o segundo é que dá zica.

Para o segundo funcionar ele depende da biblioteca lista, a seguir:

 

Cabeçalho da biblioteca:

// lista.h //
/*
Autoria: Johnson Sudré
Data...: 08/06/2015
*
Cabeçalho: Lista Encadeada
*/

#ifndef LIST_H
#define LIST_H

typedef char tipo;

// No
typedef struct no {
	tipo *info;
	struct no *prox;
} No;

// lista encadeada
typedef No Lista;



// Inicia a lista com NULL
Lista *listaIni();

// retorna um novo no' com valor indicado e aponta para NULL
No *noCria(tipo *info);

// retorna 0 se a lista for vazia
int listaVazia(Lista *_l);

// insere elemento no inicio da lista
Lista *listaInsereIni(Lista *_l, tipo *info);

// insere elemento no final da lista
Lista *listaInsereFim(Lista *_l, tipo *info);

// retorna a lista atualizada com o elemento inserido na posicao indicada
Lista *listaInsPos(Lista *_l, tipo *info, int pos);

// imprime todos os elementos da lista em linha
void listaImprime(Lista *_l);

// imprime o elemento da posicao indicada
void listaImprimePos(Lista *_l, int pos);

// retorna o tamanho da lista
int listaTam(Lista *_l);

// libera a memoria ocupada pela estrutura
void listaLibera(Lista *_l);

#endif

Biblioteca:

// lista.c //
/*
Autoria: Johnson Sudré
Data...: 08/06/2015
*
Biblioteca: Lista Encadeada
*/

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


// bibLista.c

Lista *listaIni() {
	return NULL;
}

No *noCria(tipo *info) {
	Lista *novoNo = (No*) malloc(sizeof(No));
	novoNo->info = info;
	novoNo->prox = NULL;
	return novoNo;
}

int listaVazia(Lista *_l) {
	return (_l == NULL);
}

Lista *listaInsereIni(Lista *_l, tipo *info){
	Lista *novo = noCria(info);
	novo->prox = _l;
	return (novo);
}

Lista *listaInsereFim(Lista *_l, tipo *info) {
	No *novo=noCria(info);
	No *aux=_l;
	No *ant=NULL;
	while (aux!=NULL) {
		ant=aux;
		aux=aux->prox;
	}
	if (ant==NULL) _l=novo; else ant->prox=novo;
	return(_l);
}

Lista *listaInsPos(Lista *_l, tipo *info, int pos) {
	Lista *novo = noCria(info);
	int tam = listaTam(_l);
	if (pos>tam) pos=tam;
	if (pos<=0) { // insere no inicio
		novo->prox=_l;
		return(novo);
	}
	Lista *aux=_l, *ant=NULL;
	int i;
	for (i=0;i<pos;i++) {
		ant=aux;
		aux=aux->prox;
	}
	novo->prox=ant->prox;
	ant->prox=novo;
	return(_l);
}


void listaImprime(Lista *_l){
	Lista *aux=_l;
	for (;aux!=NULL;aux=aux->prox) {
		printf("%s ", aux->info);
	}
}

void listaImprimePos(Lista *_l, int pos){
	Lista *aux = _l;
	int i=0;
	while (aux!=NULL) {
		i++;
		if (i==pos) {
			printf("%s",aux->info);
			break;
		}
		aux=aux->prox;
	}
}

int listaTam(Lista *_l) {
	int i=0;
	Lista *aux=_l;
	while (aux!=NULL) {
		i++;
		aux=aux->prox;
	}
	return i;
}

void listaLibera(Lista *_l){
	printf("\nLiberando lista");
	Lista *aux=_l;
	while (aux!=NULL) {
		No *prox = aux->prox;
		free(aux);
		aux=prox;
	}
}

Código que testa a biblioteca lista:

// teste_lista.c //
/*
Autoria: Ori
Data...: 10/07/2015
*
Testa a biblioteca lista.h
*/

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

void main() {
	system("cls");
	Lista *l=listaIni();
	l = listaInsereFim(l,"A");
	l = listaInsereFim(l,"primeira");
	l = listaInsereFim(l,"condição");
	l = listaInsereFim(l,"para");
	l = listaInsereFim(l,"modificar");
	l = listaInsereFim(l,"a");
	l = listaInsereFim(l,"realidade");
	l = listaInsereFim(l,"consiste");
	l = listaInsereFim(l,"em");
	l = listaInsereFim(l,"conhece-la.\n");
	l = listaInsereFim(l,"Eduardo");
	l = listaInsereFim(l,"Galeano.");
	listaImprime(l);
	listaLibera(l);
}

O código vai armazenar as palavras contidas num arquivo texto.txt numa lista encadeada, porém o programa trava ao criar a lista vazia e depois tentar ler o arquivo.

 

Ele até cria a lista encadeada mas ao entrar no while, na hora de ler o arquivo texto com fscanf(), trava.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então você descreveu o problema errado:

 

 

Reparem na variável _gambi_[9], um vetor de char. Ela nem é utilizada pelo programa, mas quando comento ou excluo ela o programa não funciona, mostra um conjunto de caracteres aleatórios no lugar das palavras.

 

O segundo programa também funcionou aqui:

 

isis@linux:~/src/imasters> ./a.out

A primeira condição para modificar a realidade consiste em conhece-la.
Eduardo Galeano.
Liberando lista

Ao invés de postar os pedaços separados e explicar duas coisas diferentes poste apenas o código que você quer que funcione e está dando problema, porque ambos funcionaram. No primeiro a lista nem é usada. No segundo não há leitura de arquivo. Então, não há problema algum simplesmente porque não sabemos como você está juntando as duas coisas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Leandro T.
      pessoal bom dia alguém poderia me ajudar com o FormValidation?
       
      "nomefuncionario": {
                  validators: {
                      
                  
                    notEmpty: {
                      message: "Nome completo do funcionário é obrigatório."
                    } , <=== este funciona normalmente
                      
                      callback: {  // agora o callback nao consigo fazer funcionar
                              message: 'este nome não é valido',
                              callback: function (input) {
                                  if (input.value = 'algum valor digitado') {
                                      return true
                                  } }},
                      
                      
                      
                  }
    • Por nathanmoreira
      Após diversos cálculos provindos de um código, recebo um número inteiro ao qual não sei o tamanho ao certo (pode variar de 1 pra frente). Quero passar esse número para string e formatar ele de maneira a colocar um ,00 no final e, a cada 3 números antes da virgula, um ponto. Ou seja, deixar o número num formato como: 45.114.477,00
       
      Como fazer? 
    • Por TK_T
      olá sou iniciante consegui fazer um o código de um exercício só que quando eu peço o valor 12ab ele lê como numérica alguém pode me ajudar? 
      Exercício: Leia uma string e diga se a mesma é numérica (na base decimal) ou não.
      Ex.: "123" -> numérica
      "abc" -> não numérica
      "12ab" -> não numérica
      "12.34" -> numérica 
      #include <stdio.h> int main() { char Numero; printf("Digite Algo: "); scanf("%c", &Numero); if(Numero == '1' || Numero == '2' || Numero == '3' || Numero == '4' || Numero == '5' || Numero == '6' || Numero == '7' || Numero == '8' || Numero== '9' || Numero == '0') printf("\tNumérica...\n"); else printf("\tNão Numérica\n"); return 0; }  
    • Por clayton.lima2020
      Boa Tarde!
       
      Pessoal estou com um problema para resolver:
       
      Tenho um uma string que é um Nome:  SYLVIA
       
      Eu preciso fazer uma uma busca nessa string achar a letra Y e depois verificar se após a letra Y a próxima letra é Vogal ou Consoante.
       
      No caso do nome SYLVIA a próxima letra é L então retorna Consoante.
       
      Alguém sabe montar esse algoritmo ai?
    • Por unset
      Olá, estou com uma pequena dúvida 
       
      Como transformar a data que recebemos com a função date("Y-m-d H:i") em uma string 2021-04-22T00:00 exatamente nesse formato ?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.