Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mataliebres en 26 Febrero 2015, 18:45 pm



Título: leer desde archivo en c
Publicado por: mataliebres en 26 Febrero 2015, 18:45 pm
buenas, alguien sabe si hay una funcion para leer el archivo desde el final hasta el principio?
estoy buscando pero no encuentro nada


Título: Re: leer desde archivo en c
Publicado por: fary en 26 Febrero 2015, 18:54 pm
No, no hay una función que te realice todo eso.

Mírate esto:
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos


Título: Re: leer desde archivo en c
Publicado por: mataliebres en 26 Febrero 2015, 23:12 pm
y hay alguna forma de guardar en primer lugar siempre un numero? me explico, guardar un numero y despues al guardar otro se ponga el primero, no a continuacion del primero


Título: Re: leer desde archivo en c
Publicado por: sabeeee en 27 Febrero 2015, 02:08 am
Jajaja si que hay, depende el tipo y tamaño de archivo o para que lo uses.


Título: Re: leer desde archivo en c
Publicado por: rir3760 en 27 Febrero 2015, 02:44 am
hay alguna forma de guardar en primer lugar siempre un numero? me explico, guardar un numero y despues al guardar otro se ponga el primero, no a continuacion del primero
Depende de la forma en que abras el archivo y guardes los datos en el, algo que debes explicar a detalle.

A grandes rasgos es posible en dos escenarios, si se trata de un archivo:
A) de texto plano y el numero en realidad es un dígito (o bien se imprimió indicando una anchura de campo suficiente para el valor máximo del tipo).
B) binario (apertura en modo "b" y escritura con fwrite).

En ambos casos basta con abrir el archivo en modo "r+" (mas "b" dependiendo del caso), colocarse al principio del archivo con fseek y por ultimo utilizar la misma función para escribir los datos en el.

Un saludo


Título: Re: leer desde archivo en c
Publicado por: mataliebres en 27 Febrero 2015, 07:27 am
la funcion con la que lo escribo es fprintf() y es solo un digito y con un espacio en blanco para despues ir leyendo uno a uno con fscanf(), mirare la funcion que me has dicho para colocarse siempre al principio, muchas gracias compañero
se me olvidaba el archivo es de texto normal, no binario


Título: Re: leer desde archivo en c
Publicado por: mataliebres en 2 Marzo 2015, 11:49 am
pues no funciona como dices, lo que hace es sobreescribir el numero, pero lo que quiero es que se vayan añadiendo uno delante de otro
el codigo es este

int main(int argc, char *argv[])
{     FILE *archivo1=fopen("archivo1.txt","r+");
      FILE *archivo2=fopen("archivo2.txt","r+");
      if(archivo1==NULL)
       {
       printf("el archivo1.txt no se puede abrir");
       system("PAUSE");
       return EXIT_SUCCESS;
       }
      if(archivo2==NULL)
       {
       printf("el archivo2.txt no se puede abrir");
       system("PAUSE");
       return EXIT_SUCCESS;
       }   
                             
    int numero=2, potencia,cont=0,resultado,mult,lectura=0,digito;
    printf("numero : ");
    scanf("%i",&potencia);
   
   
    for(int i=1;i<=potencia;i++)
    {
      while(1!=2)                     
     
      {if(fscanf(archivo1,"%i",&lectura)==EOF)break;
         
       else
        {
         
          resultado=lectura*numero;
          fprintf(archivo2,"%i ",resultado) ;
          fseek (archivo2,0L,SEEK_SET);
         
         
         }
    }               
    }
   
    fclose(archivo1);
    fclose(archivo2);
    system("PAUSE");
    return EXIT_SUCCESS;
}


Título: Re: leer desde archivo en c
Publicado por: rir3760 en 6 Marzo 2015, 15:17 pm
pues no funciona como dices, lo que hace es sobreescribir el numero
Todas las operaciones en archivos sobrescriben o bien agregan al final

pero lo que quiero es que se vayan añadiendo uno delante de otro
No es posible insertar en un archivo.

Hay varias alternativas, la mas sencilla consiste en:
1) Abres el archivo original y uno auxiliar.
2) Envías los datos como deseas al archivo auxiliar.
3) Cierras los archivos.
4) Eliminas el archivo original mediante la función remove (http://www.cplusplus.com/reference/cstdio/remove/).
5) Renombras el archivo auxiliar con el nombre del original mediante la función rename (http://www.cplusplus.com/reference/cstdio/rename/).

Un saludo


Título: Re: leer desde archivo en c
Publicado por: mataliebres en 6 Marzo 2015, 15:26 pm
estamos en las mismas rir3760, yo lo que quiero es leer de un archivo desde el final hasta el principio, pero por lo visto no se puede, asi que me han recomendado lo de poner la funcion fseek() al principio para escribir antes del primer numero y asi cuando se leyera seria igual que leer desde el final del archivo pero no funciona, si hago lo que dices se copiaria tal cual esta el primero no?


Título: Re: leer desde archivo en c
Publicado por: rir3760 en 7 Marzo 2015, 16:47 pm
yo lo que quiero es leer de un archivo desde el final hasta el principio, pero por lo visto no se puede
Es posible y relativamente fácil en el caso de archivos binarios, en el caso de archivos de texto plano hay varias limitaciones.

Una aproximación consiste en leer cada uno de los caracteres en el archivo tomando nota cuando se requiera del inicio de cada linea mediante la función ftell (http://www.cplusplus.com/reference/cstdio/ftell/). Ya con la posición de cada linea puedes utilizar fseek para posicionarte en la que tu quieras y leerla (recordando que las operaciones de lectura bien sobrescriben o agregan al final, no insertan).

Un programa de ejemplo donde se imprime cada una de las lineas de un archivo de texto empezando con la ultima y terminando con la primera:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_LINEAS  1024
  5. #define MAX_CHARS   1024
  6.  
  7. #define NOM_ARCHIVO  "main.c"
  8.  
  9. int main(void)
  10. {
  11.   FILE *in;
  12.   long pos[MAX_LINEAS];
  13.   int num_pos;
  14.   char linea[MAX_CHARS];
  15.   int i;
  16.   int ch;
  17.  
  18.   if ((in = fopen(NOM_ARCHIVO, "rt")) == NULL){
  19.      perror(NOM_ARCHIVO);
  20.      return EXIT_FAILURE;
  21.   }
  22.  
  23.   /* Obtenemos la posicion de inicio de cada linea en el archivo */
  24.   ch = '\n';
  25.   num_pos = 0;
  26.   do {
  27.      if (ch == '\n' && (ch = fgetc(in)) != EOF){
  28.         ungetc(ch, in);
  29.         pos[num_pos++] = ftell(in);
  30.      }
  31.   }while ((ch = fgetc(in)) != EOF);
  32.  
  33.   /* Posicionamiento sobre cada linea de la ultima a la primera */
  34.   i = num_pos;
  35.   while (i > 0){
  36.      i--;
  37.      fseek(in, pos[i], SEEK_SET);
  38.      fgets(linea, MAX_CHARS, in);
  39.      printf("%s", linea);
  40.   }
  41.   fclose(in);
  42.  
  43.   return EXIT_SUCCESS;
  44. }

Un saludo


Título: Re: leer desde archivo en c
Publicado por: mataliebres en 7 Marzo 2015, 18:12 pm
gracias rir!! ya me ha hecho el programa que queria hacer un compañero del foro, pero me guardo tu codigo, que me va a hacer falta mas adelante
muchas gracias compañero