leer desde archivo en c

Iniciado por mataliebres, 26 Febrero 2015, 18:45 PM

0 Miembros y 1 Visitante están viendo este tema.

mataliebres

buenas, alguien sabe si hay una funcion para leer el archivo desde el final hasta el principio?
estoy buscando pero no encuentro nada

fary

Un byte a la izquierda.

mataliebres

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

sabeeee

Jajaja si que hay, depende el tipo y tamaño de archivo o para que lo uses.
"Vengándose, uno iguala a su enemigo; perdonando, uno se muestra superior a él."
Francis Bacon

rir3760

Cita de: mataliebres en 26 Febrero 2015, 23:12 PMhay 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

mataliebres

#5
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

mataliebres

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;
}

rir3760

Cita de: mataliebres en  2 Marzo 2015, 11:49 AMpues no funciona como dices, lo que hace es sobreescribir el numero
Todas las operaciones en archivos sobrescriben o bien agregan al final

Cita de: mataliebres en  2 Marzo 2015, 11:49 AMpero 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.
5) Renombras el archivo auxiliar con el nombre del original mediante la función rename.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

mataliebres

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?

rir3760

Cita de: mataliebres en  6 Marzo 2015, 15:26 PMyo 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. 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:
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINEAS  1024
#define MAX_CHARS   1024

#define NOM_ARCHIVO  "main.c"

int main(void)
{
   FILE *in;
   long pos[MAX_LINEAS];
   int num_pos;
   char linea[MAX_CHARS];
   int i;
   int ch;
   
   if ((in = fopen(NOM_ARCHIVO, "rt")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   
   /* Obtenemos la posicion de inicio de cada linea en el archivo */
   ch = '\n';
   num_pos = 0;
   do {
      if (ch == '\n' && (ch = fgetc(in)) != EOF){
         ungetc(ch, in);
         pos[num_pos++] = ftell(in);
      }
   }while ((ch = fgetc(in)) != EOF);
   
   /* Posicionamiento sobre cada linea de la ultima a la primera */
   i = num_pos;
   while (i > 0){
      i--;
      fseek(in, pos[i], SEEK_SET);
      fgets(linea, MAX_CHARS, in);
      printf("%s", linea);
   }
   fclose(in);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language