Ir ao conteúdo
  • Cadastre-se

C Leitor de Arquivo - Não imprime primeiro caractere


GabrielrRoc

Posts recomendados

Estou desenvolvendo essa biblioteca como trabalho final de Algoritimos e Estrutura de Dados I, estou com problemas na função quando o resultado da função leitorArquivo_ler.

A biblioteca é essa "LeitorArquivo.h":

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

typedef struct{    
    FILE* arquivo;
    char* nomeArquivo;
    char delimitador;
    char* buffer;
    int tamBuffer;
    int tamArquivo;
    int posBuffer;
    int posArquivo;
}LeitorArquivo;


//PROTOTIPOS

LeitorArquivo* leitorArquivo_criar(char* arquivo, int tamBuffer);
int leitorArquivo_buffer(LeitorArquivo* leitor);
void leitorArquivo_desalocar(LeitorArquivo* leitor);
int leitorArquivo_ler(LeitorArquivo* leitor, char* endereco);
int leitorArquivo_temMaisLinhas(LeitorArquivo* leitor);


//IMPLEMENTACAO

LeitorArquivo* leitorArquivo_criar(char* arquivo, int tamBuffer){
    LeitorArquivo* l = (LeitorArquivo*) malloc (sizeof(LeitorArquivo));
    l->delimitador = '\n';
    l->posBuffer = 0;
    l->posArquivo = 0;
    l->tamBuffer = tamBuffer;
    int tam = strlen(arquivo);
    l->nomeArquivo = (char*) malloc (tam * sizeof(arquivo));
    strcpy(l->nomeArquivo, arquivo);
    l->arquivo = fopen(l->nomeArquivo, "r");

    if (l->arquivo == NULL){
		printf ("\t Erro na abertura do arquivo! \n");
        return 0;
    }

	else {
        fseek (l->arquivo, 0, SEEK_END);
        l->tamArquivo = ftell (l->arquivo);
    }

    return l;
}

int leitorArquivo_buffer(LeitorArquivo* leitor){
    if(leitorArquivo_temMaisLinhas(leitor) != 1) return 0;
    
    fflush(leitor->arquivo);

    leitor->arquivo = fopen(leitor->nomeArquivo, "r");
    int resultado = 0;
    fseek(leitor->arquivo, leitor->posArquivo, SEEK_SET);
    int tam = leitor->tamBuffer;

    if (leitor->arquivo == NULL){
		printf ("\t Erro na abertura do arquivo!\n");
        return 0;
    }

	else {
        leitor->buffer = (char*) malloc (tam * sizeof(char));
        resultado = fread (leitor->buffer, 1, tam, leitor->arquivo);
        leitor->buffer[resultado] = '\0';
        leitor->tamArquivo = ftell(leitor->arquivo);
        leitor->posBuffer = 0;
        leitor->posArquivo += tam;
        fclose(leitor->arquivo);
    }

    return 1;
}

void leitorArquivo_desalocar(LeitorArquivo* leitor){
    free(leitor->nomeArquivo);
    free(leitor->buffer);
    free(leitor);
}

int leitorArquivo_ler(LeitorArquivo* leitor, char* endereco){
    if(leitor->posArquivo == 0){
        leitorArquivo_buffer(leitor);
    }

    else if(leitor->posBuffer >= leitor->tamBuffer){
        free(leitor->buffer);
        leitorArquivo_buffer(leitor);
    }

    int inicio, fim, tam;
    char c = leitor->buffer[leitor->posBuffer], inter[500];
    inicio = leitor->posBuffer;

    while(leitor->posBuffer < leitor->tamBuffer && c != leitor->delimitador){
        c = leitor->buffer[++leitor->posBuffer];
    }

    fim = leitor->posBuffer;
    leitor->posBuffer++;
    tam = fim - inicio;
    // strncpy(destino, origem, qtdCaracteres);
    strncpy(inter, leitor->buffer + inicio, tam);
    strcpy(endereco, inter);
    endereco[tam] = '\0';
    return 1;
}

int leitorArquivo_temMaisLinhas(LeitorArquivo* leitor){
    if(leitor->posArquivo >= leitor->tamArquivo){
        if(leitor->posBuffer >= leitor->tamBuffer){
            return 0;
        }
    }

    return 1;
}

E estou testando com esse código "LeitorArquivo.c":

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

#include "leitorArquivo.h"

int main(){

    char* arquivo = "teste.txt";
    int tamanho = 100;
    LeitorArquivo* l1 = leitorArquivo_criar(arquivo, tamanho);

    char linha[500];
    while(leitorArquivo_temMaisLinhas(l1)){
        leitorArquivo_ler(l1, linha);
        printf("%s \n", linha); 
    }
    leitorArquivo_desalocar(l1);
    
}

E esse arquivo "teste.txt":

Is this the 
real life
or is it 
just fantasy

E o problema é que a impressão após rodar o código é:

 s this the 
 eal life
 r is it 
just fantasy

Realmente não faço ideia do que possa estar acontecendo, alguém consegue me dar uma luz? Os arquivos estão anexados caso queiram testar.

leitorArquivo.zip

adicionado 24 minutos depois
24 minutos atrás, GabrielrRoc disse:

printf"%s \n", linha);

Consegui resolver dando um espaço nesse trecho do código, alguém explica por que?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!