Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Dato erroneo de strlen()

Preguntas y respuestas sobre el lenguaje de programacion C/C++

Dato erroneo de strlen()

Notapor Jrr123 el Vie Dic 08, 2006 6:17 pm

Bueno mi problema es el siguiente.
Tengo un archivo de texto(.txt), mediante un bucle while y fgetc voy capturando caracter a caracter lo k hay escrito en el archivo y voy creando una matriz de caracteres.
El problema esta en k cuando solo hay escrita una linea no da error
pero en cuanto es mas de 1 linea comienzan los errores, devuelve mal la longitud, si le pido k muestro la cadena tb lo hace mal.
Código: Seleccionar todo
#include <stdio.h>
#include <conio.h>
#include <string.h>

void main(){
FILE *archivo;
char buffer[50];

int n=0;
int partes;
int posicion;
int longitud;




     if((archivo=fopen("D:\\Documents and Settings\juan\\Escritorio\\prog\\aaa.txt","r+t"))== NULL){
   printf("La ruta especificada no corresponde a ningun archivo.");
   return;                        //Abro lectura
   }
   while((buffer[n] = fgetc(archivo)) != EOF){
   n++;                                 //leo caracter por caracter y creo una matriz de caracteres
   }
   printf("Introduzca en cuantas partes kiere partir el archivo");
   scanf("%d",&partes);


   longitud = strlen(buffer);     //Asigno n a  la longitud de la cadena
   longitud/=partes;              //Se divide entre las aprtes elegidas

   printf("%d",longitud);
   printf("%s", buffer);
   fcloseall();
   getche();
Jrr123
Novato
Novato
 
Mensajes: 4
Registrado: Vie Dic 08, 2006 6:12 pm

Re: Dato erroneo de strlen()

Notapor yalmar el Vie Dic 08, 2006 9:58 pm

char buffer[50];
...
while((buffer[n] = fgetc(archivo)) != EOF){
n++; //leo caracter por caracter y creo una matriz de caracteres
}


Tu definiste un buffer de solo 50 caracteres, entonces esta correcto que tengas errores si tu archivo tiene mas de 50.

si quieres hacerlo de esa forma lo que puedes hacer es obtener el número de acaracteres primero

Código: Seleccionar todo
while(fgetc(archivo) != EOF){
   n++;
}


y luego
Código: Seleccionar todo
buffer = new char[n];
int i = 0;
while((buffer[n] = fgetc(archivo)) != EOF){
i++;
}



salu2
Avatar de Usuario
yalmar
Programador
Programador
 
Mensajes: 240
Registrado: Mié Jun 09, 2004 4:13 pm
Ubicación: Brasil

Notapor Jrr123 el Sab Dic 09, 2006 4:45 am

OK gracias por la respuesta pero hay un problema.
Código: Seleccionar todo
buffer = new char[n];
int i = 0;
while((buffer[n] = fgetc(archivo)) != EOF){
i++;
}

El IDE no recnonoce la asignacion buffer = new char[n];
Tb lo he intentado con char buffer[n]; pero necesita k n sea constante.
Sobre el primer codigo aunk el arhivo contenga tan solo 3 caracteres , si estan entres saltos de linea diferentes da error.
Saludos y gracias
Jrr123
Novato
Novato
 
Mensajes: 4
Registrado: Vie Dic 08, 2006 6:12 pm

Re: Dato erroneo de strlen()

Notapor yalmar el Sab Dic 09, 2006 7:03 am

olvidaste declar buffer como:
Código: Seleccionar todo
char* buffer;

y tambien no olvides de volver al inicio del archivo luego que obtuviste el número de caracteres.
Código: Seleccionar todo
buffer = new char[n];
int i = 0;
// aqui reset file
...
Avatar de Usuario
yalmar
Programador
Programador
 
Mensajes: 240
Registrado: Mié Jun 09, 2004 4:13 pm
Ubicación: Brasil

Notapor Jrr123 el Sab Dic 09, 2006 9:38 am

Perdona k pregunte tanto pero es k estoy empezando y no tengo mucha idea xD
Código: Seleccionar todo
void main(){

FILE *archivo;


int n=0;
int partes;
int posicion;
int longitud;
int cond=0;
char *buffer;
inicio:

     if((archivo=fopen("abajo.txt","r+t"))== NULL){
   printf("La ruta especificada no corresponde a ningun archivo.");
   return;                        //Abro lectura
   }
   while(fgetc(archivo) != EOF){
   n++;
   }
   fcloseall();

   buffer = new char[n];
   int i = 0;
   if(cond==0 ){
   goto inicio;
   cond++;
   }
   while((buffer[i] = fgetc(archivo)) != EOF){
   i++;
   }


   printf("Introduzca en cuantas partes kiere partir el archivo");
   scanf("%d",&partes);


   //longitud = strlen(buffer);     //Asigno n a  la longitud de la cadena
   //longitud/=partes;              //Se divide entre las aprtes elegidas

   //printf("%d",longitud);
   printf("%s", buffer);
   fcloseall();
   getche();



   }


No comprendo lo k pasa, te agradeceria k me explicaras k hago mal.
Salu2 y gracias
Jrr123
Novato
Novato
 
Mensajes: 4
Registrado: Vie Dic 08, 2006 6:12 pm

Re: Dato erroneo de strlen()

Notapor yalmar el Sab Dic 09, 2006 11:20 am

Código: Seleccionar todo
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main(){
  FILE *archivo;
  char *buffer;
 
  int n=0;
  int partes;
  int posicion;
  int longitud;

   if((archivo=fopen("abajo.txt","r+t"))== NULL){
     printf("La ruta especificada no corresponde a ningun archivo.");
     return 0;                        //Abro lectura
   }
   
   while(fgetc(archivo) != EOF){
     n++;                                 //leo caracter por caracter y creo una matriz de caracteres
   }
   
   buffer = new char[n];
   char buff[n];
   n = 0;
   rewind(archivo); // ir al inicio de nuevo
     
   while((buffer[n] = fgetc(archivo)) != EOF){
     n++;                                 //leo caracter por caracter y creo una matriz de caracteres
   }
   
   printf("%s", buffer);
   
   printf("\nIntroduzca en cuantas partes kiere partir el archivo");
   scanf("%d",&partes);


   longitud = strlen(buffer);     //Asigno n a  la longitud de la cadena
   longitud/=partes;              //Se divide entre las aprtes elegidas

   printf("%d",longitud);
   printf("%s", buffer);
   fclose(archivo);
   getche();
   return 0;
}
Avatar de Usuario
yalmar
Programador
Programador
 
Mensajes: 240
Registrado: Mié Jun 09, 2004 4:13 pm
Ubicación: Brasil

Notapor Jrr123 el Sab Dic 09, 2006 3:44 pm

Ok muchas gracias,pensaba ke cuando decias ir al cominezo pensaba k era otra cosa.
Jrr123
Novato
Novato
 
Mensajes: 4
Registrado: Vie Dic 08, 2006 6:12 pm


Volver a C/C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados