Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con cadenas y punteros.

Estas en el tema de Problema con cadenas y punteros. en el foro de C/C++ en Foros del Web. Tengo una función para ir leyendo linea a linea un fichero. int _file_ply::read_line(){ if (!feof(File)){ fgets(Buffer,MAX_LENGTH_LINE,File); if (strlen(Buffer)==0) return(-1); Num_lines++; printf(" - %d - ",strlen(Buffer)); ...
  #1 (permalink)  
Antiguo 16/06/2011, 12:14
 
Fecha de Ingreso: noviembre-2009
Mensajes: 36
Antigüedad: 14 años, 5 meses
Puntos: 0
Problema con cadenas y punteros.

Tengo una función para ir leyendo linea a linea un fichero.

int _file_ply::read_line(){
if (!feof(File)){
fgets(Buffer,MAX_LENGTH_LINE,File);
if (strlen(Buffer)==0) return(-1);
Num_lines++;
printf(" - %d - ",strlen(Buffer));
//printf("%d:%s",Num_lines,Buffer);
return(0);
}
return(-1);
}

El documento que leo 1º tiene una etapa de 3 numeros y luego de 4 numeros.

ej:


1 2 4
2 3 6
2 4 6
3 1 2 3
3 4 5 7
3 4 5 6

El problema empieza cuando empezamos con las lineas de 4 numeros.

strlen(Buffer) me dice que que tiene tamaño 9 las lineas.

Luego lee el 1 numero, strlen(Buffer) = 8

Luego lee el 2 numero, strlen(Buffer) = 6

Luego lee el 3 numero, strlen(Buffer) = 4

Pero cuando va a leer el 4 numero dice que encuentra un '\n' y si fuerzo el puntero al Buffer haciendole p1=Buffer; p1++; entonces me da una violacion de segmento, no lo entiendo ya que aun tendriamos 4 posiciones de memoria mas donde seguir mirando.

Por favor , me podríais ayudar????

Muchas gracias.
  #2 (permalink)  
Antiguo 16/06/2011, 16:11
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con cadenas y punteros.

En principio todas las lineas de 3 deberian tener el mismo tamaño y todas las de 4 numeros el mismo tamaño.

Cuando hablas de "lee el 1 numero" estas hablando de leer el primer numero...como estas leyendo ese numero...no lo pusiste en el codigo.

Solo pusiste la lectura de las lineas. Que en principio esta bien,

El printf que esta comentado, imprimia lo que correspondia o ya habia un error desde ahi?
  #3 (permalink)  
Antiguo 17/06/2011, 00:44
 
Fecha de Ingreso: noviembre-2009
Mensajes: 36
Antigüedad: 14 años, 5 meses
Puntos: 0
Problema con cadenas y punteros.

Perdon por tener un codigo tan sucio , pero es que me esta volviendo loco esto.

si me refiero al primer numero.

He descomentado el printf que dices. Te pongo la funcion que le los numeros.

int _file_ply::next_token()
{
printf("<<<<<<<<<<<<<<<<<<");
char *p1,*p2;
char Aux_token[100];
int Num_char;

do
{
printf("||%d||",strlen(Buffer));
if (strlen(Buffer)==0)
{
if (read_line()==-1) return(-1);
while (Buffer[0]=='#') if (read_line()==-1) return(-1);
}
p1=Buffer;
int conti=0;
printf("\nraa2 -- %d:%s",Num_lines,Buffer);
while ((*p1==' ' || *p1=='\t') && *p1!='\n'){ p1++;conti++;}
p2=p1;
if(*p2!='\n')
printf("conti %d la %c ",conti,*p2);
else
{
printf("salti %d la ",conti);
if (strlen(Buffer)==4)
{
printf("CUMPLE");
//p1++;
}
}
while (*p2!=' ' && *p2!='\t' && *p2!='\n') {p2++;conti++;}
Num_char=p2-p1;
if (Num_char>99)
{
error("number of characters for token is too long\n");
return(-1);
}
if (Num_char!=0)
{
strncpy(Aux_token,p1,Num_char);
Aux_token[Num_char]='\0';
}
if (*p2=='\n'){ Buffer[0]='\0'; printf("arriba ");}
else {strcpy(Buffer,p2); printf("abajo ");}
}
while (Num_char==0);

if (!is_number(Aux_token))
{
//printf("es un numero %s\n",Aux_token);
Yylval.Real=atof(Aux_token);
printf("%f\n",Yylval.Real);
return((int)_tokens(NUMBER));
}
else
{
//printf("es texto %s\n",Aux_token);
Yylval.Text=Aux_token;
return(search_token(Aux_token));
}
}

ahora la ejecucion cuando empieza a leer las lineas con 4 numeros.

pasados 0
<<<<<<<<<<<<<<<<<<||2||
raa2 -- 495:
salti 1 la arriba ||0||
raa -- 496:3 0 1 2
<9>

raa2 -- 496:3 0 1 2
conti 0 la 3 abajo 3.000000
<<<<<<<<<<<<<<<<<<||8||
raa2 -- 496: 0 1

conti 1 la 0 abajo 0.000000
<<<<<<<<<<<<<<<<<<||6||
raa2 -- 496: 1

conti 1 la 1 abajo 1.000000
<<<<<<<<<<<<<<<<<<||4||
raa2 -- 496:


salti 1 la CUMPLEarriba ||0||
raa -- 497:3 1 3 2


al leer la linea 496 coge los 4 numeros , pero en la funcion de lectura de los numeros al leer el numero 3, se pierde el ultimo numero que seria el 2.

¿por que desaparece del buffer?
  #4 (permalink)  
Antiguo 21/06/2011, 00:45
 
Fecha de Ingreso: noviembre-2009
Mensajes: 36
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Problema con cadenas y punteros.

¿Alguien sabe donde esta el error?

O ¿Me podrían ayudar a leer de otra forma el buffer?
  #5 (permalink)  
Antiguo 21/06/2011, 12:24
 
Fecha de Ingreso: febrero-2008
Ubicación: Leon
Mensajes: 19
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Problema con cadenas y punteros.

No se donde este exactamente el problema con tu codigo, pero yo probe este pequeño programa que lee lineas de un archivo de texto y funciono bien (compilado en Borland C++ Builder v6 bajo windows xp):

Código:
#include <stdio.h>
#include <conio.h>
#define MAX_LINE_SIZE 10
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
        FILE *fStream;
        char buffer[10];
        fStream = fopen("Numeros.txt","r+");
        fseek(fStream, 0, SEEK_SET);

        while(  fgets(buffer,MAX_LINE_SIZE,fStream) != NULL )
           printf("%s",buffer);

        fclose(fStream);
        getch();
        return 0;
}
//---------------------------------------------------------------------------
  #6 (permalink)  
Antiguo 22/06/2011, 14:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con cadenas y punteros.

Aqui tienes algo simple usando sscanf:


Código C:
Ver original
  1. #include <stdio.h>
  2. #define MAX_LINE_SIZE 100
  3. int main(int argc, char* argv[])
  4. {
  5.         FILE *fStream;
  6.         char buffer[100];
  7.         int n1,n2,n3,n4;
  8.         fStream = fopen("Numeros.txt","r+");
  9.         fseek(fStream, 0, SEEK_SET);
  10.  
  11.         while(  fgets(buffer,MAX_LINE_SIZE,fStream) != NULL ){
  12.            //printf("%s",buffer);
  13.            sscanf(buffer," %d %d %d %d", &n1,&n2,&n3,&n4);
  14.            printf("%d %d %d %d \n",n1,n2,n3,n4);
  15.         }
  16.  
  17.         fclose(fStream);
  18.         return 0;
  19. }
  #7 (permalink)  
Antiguo 27/06/2011, 08:17
 
Fecha de Ingreso: noviembre-2009
Mensajes: 36
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Problema con cadenas y punteros.

Gracias pero no pude arreglarlo como decíais.

Al final lo que he hecho es crearme otro buffer(buffer2) dentro de la funcion next_token, que se rellena la 1ª vez que se lee la linea con lo que hay en buffer, y luego hasta que no se lee la linea entera se esta usando buffer2.

No entiendo por que vale así, pero por mas que lo miraba la variable buffer perdía el final de la linea.....

Lo importante es que ya vale :)

Etiquetas: cadenas, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:49.