elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pequeño error en ficheros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeño error en ficheros  (Leído 2,312 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Pequeño error en ficheros
« en: 9 Mayo 2012, 17:26 pm »

Hola.

Estoy intentando leer las n últimas líneas de un fichero, para, posteriormente, almacenarlas en otro.

Por ejemplo, si mi fichero tiene:

Código:
hola
adiós
duda
ficheros
punteros
estructuras

y meto el número 3 por consola, después de introducir el nombre del fichero, me debería leer:

Citar
ficheros
punteros
estructuras

Y, sin embargo, me lee:

Código:
os
punteros
estructuras

Mi código es:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. typedef struct{
  5.  
  6. int *V;
  7. int lineas;
  8.  
  9. }Estructura;
  10.  
  11. char* InicializarCadena();
  12. Estructura Contar(FILE *fp);
  13. void Almacenar(FILE *fp1,FILE *fp2,Estructura aux,int n);
  14.  
  15. int main (){
  16.  
  17. FILE *fp1;
  18. FILE *fp2;
  19.  
  20. int n;
  21.  
  22. char *fich,c;
  23.  
  24. Estructura aux;
  25.  
  26. printf("Introduzca el nombre del fichero: ");
  27.  
  28. fich=InicializarCadena();
  29.  
  30.  
  31. printf("Introduce un numero: ");
  32. scanf("%d", &n);
  33.  
  34.    fp1=fopen(fich, "r");
  35.    fp2=fopen("Trabajo.txt", "w");
  36.  
  37.  
  38.    if(fp1==NULL){
  39.    printf("ERROR");
  40.    system("pause");
  41.    exit(1);
  42.    }
  43.  
  44.    aux=Contar(fp1);
  45.  
  46.  
  47.    Almacenar(fp1,fp2,aux,n);
  48.  
  49. free(aux.V);
  50. free(fich);
  51. fclose(fp1);
  52. fclose(fp2);
  53.  
  54. system("pause");
  55. }
  56.  
  57.  
  58. char* InicializarCadena(){
  59.   int i = 0;
  60.   char c, *cad;
  61.  
  62.   cad = (char*) malloc(sizeof(char));
  63.  
  64.   while((c = getchar())!= '\n'){
  65.      cad[i] = c;
  66.      i++;
  67.      cad = (char*)realloc(cad, (i + 1)*sizeof(char));
  68.   }
  69.   cad[i] = '\0';
  70.  
  71.   return cad;
  72. }
  73.  
  74. Estructura Contar(FILE *fp){
  75.  
  76. int i=0;
  77.  
  78. Estructura aux;
  79.  
  80. char c;
  81.  
  82. aux.lineas=0;
  83.  
  84. aux.V=(int*) malloc(sizeof(int));
  85.  
  86. while(feof(fp)==0){
  87.  
  88. c=fgetc(fp);
  89. i++;
  90.  
  91. if(c=='\n'){
  92. aux.V=(int*) realloc(aux.V,(aux.lineas+1)*sizeof(int));
  93. aux.V[aux.lineas]=i;
  94.  
  95. aux.lineas++;
  96. }
  97. }
  98. aux.lineas++;
  99. return(aux);
  100. }
  101.  
  102. void Almacenar(FILE *fp1,FILE *fp2,Estructura aux,int n){
  103.  
  104. char c;
  105.  
  106. fseek(fp1,aux.V[aux.lineas-n],SEEK_SET);
  107.  
  108.  
  109.  
  110. while(feof(fp1)==0){
  111.  
  112. c = fgetc(fp1);
  113. fputc(c,fp2);
  114. printf("%c", c);
  115.  
  116. }
  117.  
  118. }
  119.  

¿Qué hago mal?

Muchas gracias.

Saludos.


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Pequeño error en ficheros
« Respuesta #1 en: 9 Mayo 2012, 20:24 pm »

Hola! tratando de ayudart con este problema, vi algo q la verdad no tengo idea de porque pasa. Antes de responderte, primero necesito que ejecutes este codigo
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5.    char c;
  6.    int i=0, j=0;
  7.    FILE *fp1=fopen("archivo.txt", "r");
  8.  
  9.  
  10.    while(j<8){
  11.    c=fgetc(fp1);
  12.    i=ftell(fp1);
  13.  
  14.    printf("i:%d %d %c\n",i,c, c);
  15.    j++;
  16.  
  17. }
  18.    system("PAUSE");
  19.    return 0;
  20. }
El archivo.txt es el q vos tenes con: hola, adios........ Vas a ver q cuando lo ejecutas pasa algo(q hasta 1 min no sabia) interesant. Cuando ftell devuelve 4 se imprime 97 y el caracter 'a', hasta aca bien. Pero en el siguiente ciclo vas a notar que ftell no vale 5(como deberia ser) vale 6 y al lado se imprime el 10 y el salto de linea(ENTER)
La verdad nose xq despues de imprimir 'a', ftell devuelve 6 ¿y el 5??? es como que despues de la 'a' de "hola" hay dos "caracteres": uno nose(seria el 5) y el otro es el enter(el 6)

Sabiendo esto, te dejo modificado la parte del codigo q tendrias mal:
Código
  1. while(feof(fp)==0){
  2.  
  3. c=fgetc(fp);
  4. i++;
  5.  
  6. if(c=='\n'){
  7.            i++;// HAY Q AGREGAR UN INCREMENTO ADICIONAL
  8. aux.V=(int*) realloc(aux.V,(aux.lineas+1)*sizeof(int));
  9. aux.V[aux.lineas]=i;
  10.  
  11. aux.lineas++;
  12. }
  13. }
  14. //aux.lineas++; este incremento estaria demas
  15. return(aux);
  16. }
Agregue un i++ dentro del if, por lo mencionado anteriormente. Comente aux.lineas++; ya q esta demas. Enrealidad no esta demas solo q despues en
Código
  1. fseek(fp1,aux.V[aux.lineas-n],SEEK_SET);
ademas de restarle n tambien tendrias q restarle 1. Acordate q los arreglos van de 0 a n-1

Otra cosa para arreglar es
Código
  1. while(feof(fp1)==0){
  2.  
  3. c = fgetc(fp1);
  4. fputc(c,fp2);
  5. printf("%c", c);
  6. }
tendria q ser
Código
  1. if((c = fgetc(fp1))!=EOF) // tenes q comprar q no sea EOF
  2. fputc(c,fp2);
ya q vas a guardar un caracter demas(basura en fp2). Tenes q poner ese if ya que en cierto modo estas haciendo mal el ciclo while, primero se lee del archivo luego se comprueba q no sea fin de archivo y se vuelve a leer ....ej:
Código
  1. c=fgetc(fp1); // primero leo del archivo
  2. while(feof(fp1)==0){ // compruebo
  3.  
  4. fputc(c,fp2); // guardo en fp2
  5. printf("%c", c);
  6. c=fgetc(fp1);  // vuelvo a leer
  7. }

Bueno hasta aca llega lo q pude deducir(bastante interesant aunq me qdo un vacio ya q no entendi xq pasa eso), espero q alguien pueda responder el porque de ftell salta de 4 a 6

Saludos


En línea

Ahorrate una pregunta, lee el man
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Pequeño error en ficheros
« Respuesta #2 en: 9 Mayo 2012, 20:52 pm »

Muchas gracias por tu ayuda. Ya he editado el código para que salga bien.

A ver si alguien nos puede explicar por qué pasa eso...

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeño error de ortografía
Sugerencias y dudas sobre el Foro
....................................... 4 2,574 Último mensaje 4 Abril 2007, 16:26 pm
por el-brujo
Pequeño error en el foro... « 1 2 3 4 »
Sugerencias y dudas sobre el Foro
Diego Arenas 35 14,289 Último mensaje 27 Marzo 2009, 02:02 am
por Diego Arenas
[C] un pequeño error. [Solucionado]
Programación C/C++
STANHMAL 3 2,968 Último mensaje 6 Julio 2010, 02:16 am
por .:BlackCoder:.
Error C++ ficheros y tildes
Programación C/C++
Desiresportal 5 6,982 Último mensaje 17 Marzo 2015, 15:54 pm
por Desiresportal
[C++] Error con ficheros.
Programación C/C++
Zodiak98 1 1,879 Último mensaje 26 Noviembre 2016, 23:39 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines