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
Consegui resolver dando um espaço nesse trecho do código, alguém explica por que?