Saludos, tengo problemas con unos fseeks que tengo dentro de un ciclo while que me lee un archivo, pero a la hora de imprimir el archivo no lo hace correctamente
este es el codigo:
[
y el archivo es
quote]ABA NO INH 1806 2 0 2
ADCA SI IMM 89ii 1 1 2
DIR 99dd 1 1 2
EXT B9hhll 1 2 3
IDX A9xb 1 1 2
IDX1 A9xbff 1 2 3
IDX2 A9xbeeff 1 3 4
[D,IDX] A9xb 1 1 2
[IDX2] A9xbeeff 1 3 4[/quote]
el problema es que cuando llega al codop ADCA no me imprime toda la linea solo me imprime
[]....[ADCA]...[SI]...[IMM]...[89ii]....[1]...[1]
esto se arregla si le quito el primer fseek() que aparece en el while() de la funcion listaTABOP, pero si se lo quito ahora los codops siguientes al ADCA los imprime sin la primer letra, se la come,entonces como puedo arreglar este problema
gracias
este es el codigo:
Código (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 8
typedef enum {INS,OP,DIR,MAQ,CALCULADO,CALCULAR,TOTAL} tabla;
void buscarFinLinea(FILE *hc12);
void listaTABOP();
char *Tabla_Operandos(FILE *hc12,int tabla);
void ignorarEspacios(FILE *hc12);
void quitarSaltosLinea(char *cadena);
int main()
{
listaTABOP();
return 0;
}
void buscarFinLinea(FILE *hc12)
{
int car;
while((car = fgetc(hc12))!= '\n')
;
}
void quitarSaltosLinea(char *c)
{
char *ptr;
if(((ptr = strchr(c,'\n'))!= NULL)||((ptr = strchr(c,'\t'))!= NULL)||((ptr = strchr(c,' '))!= NULL))
*ptr = '\0';
}
void listaTABOP()
{
int car,i,pos,n;
FILE *hc12;
COD *ultimo = NULL;
char *ins,*op,**dir,**maq,**cal,**x_cal,**sum;
if((hc12 = fopen("Tabla_OP.txt","r"))!= NULL)
{
while((car = fgetc(hc12))!= EOF)
{
i = 0;
fseek(hc12,-1,SEEK_CUR);
ins = Tabla_Operandos(hc12,INS);
printf("[%s]\t",ins);
ignorarEspacios(hc12);
op = Tabla_Operandos(hc12,OP);
printf("[%s]",op);
pos = ftell(hc12);
buscarFinLinea(hc12);
if((car = fgetc(hc12)) != '\t')
{
n = 0;
fseek(hc12,pos,SEEK_SET);
ignorarEspacios(hc12);
dir = (char**)malloc(sizeof(char*));
dir[i] = Tabla_Operandos(hc12,DIR);
printf("\t[%s]\t",dir[i]);
ignorarEspacios(hc12);
maq = (char**)malloc(sizeof(char*));
maq[i] = Tabla_Operandos(hc12,MAQ);
printf("[%s]\t",maq[i]);
ignorarEspacios(hc12);
cal = (char**)malloc(sizeof(char*));
cal[i] = Tabla_Operandos(hc12,CALCULADO);
printf("[%s]\t",cal[i]);
ignorarEspacios(hc12);
x_cal = (char**)malloc(sizeof(char*));
x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
printf("[%s]\t",x_cal[i]);
ignorarEspacios(hc12);
sum = (char**)malloc(sizeof(char*));
sum[i] = Tabla_Operandos(hc12,TOTAL);
printf("[%s]\n",sum[i]);
buscarFinLinea(hc12);
}
else
{
n = 1;
fseek(hc12,pos,SEEK_SET);
dir = (char**)malloc(MAX*sizeof(char*));
maq = (char**)malloc(MAX*sizeof(char*));
cal = (char**)malloc(MAX*sizeof(char*));
x_cal = (char**)malloc(MAX*sizeof(char*));
sum = (char**)malloc(MAX*sizeof(char*));
do
{
ignorarEspacios(hc12);
dir[i] = Tabla_Operandos(hc12,DIR);
printf("\t[%s]\t",dir[i]);
ignorarEspacios(hc12);
maq[i] = Tabla_Operandos(hc12,MAQ);
printf("[%s]\t",maq[i]);
ignorarEspacios(hc12);
cal[i] = Tabla_Operandos(hc12,CALCULADO);
printf("[%s]\t",cal[i]);
ignorarEspacios(hc12);
x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
printf("[%s]\t",x_cal[i]);
ignorarEspacios(hc12);
sum[i] = Tabla_Operandos(hc12,TOTAL);
printf("[%s]\n",sum[i]);
buscarFinLinea(hc12);
i++;
printf("\t");
}while((car = fgetc(hc12)) == '\t');
}
}
}
else
printf("No se pudo abrir el archivo");
}
void ignorarEspacios(FILE *hc12)
{
int car;
do
{
car = fgetc(hc12);
}while(car == '\t' || car == ' ');
}
char *Tabla_Operandos(FILE *hc12,int tabla)
{
int car,lon = 0,pos;
char *c;
fseek(hc12,-1,SEEK_CUR);
pos = ftell(hc12);
if((tabla==INS)||(tabla==OP)||(tabla==DIR)||(tabla==MAQ)||(tabla==CALCULADO)||(tabla==CALCULAR))
{
do
{
car = fgetc(hc12);
lon++;
}while(car != '\t' && car != EOF);
}
else
{
do
{
car = fgetc(hc12);
lon++;
}while(car != '\n' && car != EOF);
lon--;
}
fseek(hc12,pos,SEEK_SET);
c = (char*)calloc((lon+1),sizeof(char));
fgets(c,lon+1,hc12);
quitarSaltosLinea(c);
return c;
}
[
y el archivo es
quote]ABA NO INH 1806 2 0 2
ADCA SI IMM 89ii 1 1 2
DIR 99dd 1 1 2
EXT B9hhll 1 2 3
IDX A9xb 1 1 2
IDX1 A9xbff 1 2 3
IDX2 A9xbeeff 1 3 4
[D,IDX] A9xb 1 1 2
[IDX2] A9xbeeff 1 3 4[/quote]
el problema es que cuando llega al codop ADCA no me imprime toda la linea solo me imprime
[]....[ADCA]...[SI]...[IMM]...[89ii]....[1]...[1]
esto se arregla si le quito el primer fseek() que aparece en el while() de la funcion listaTABOP, pero si se lo quito ahora los codops siguientes al ADCA los imprime sin la primer letra, se la come,entonces como puedo arreglar este problema
gracias