Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/05/2012, 12:33
cesar_casla
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Pequeño error en ficheros

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 C:
Ver original
  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 C:
Ver original
  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 C:
Ver original
  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 C:
Ver original
  1. while(feof(fp1)==0){
  2.  
  3. c = fgetc(fp1);
  4. fputc(c,fp2);
  5. printf("%c", c);
  6. }
tendria q ser
Código C:
Ver original
  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 C:
Ver original
  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

PD: te respondo en este foro tambien xD por si es q alguien me ayuda a mi pregunta