Como utilizar Struct stat

Iniciado por txiki481, 6 Mayo 2018, 12:19 PM

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

txiki481

Hola tengo este programa y quiero que cuando acabe devuelva información sobre el archivo, y para ello he usado struct stat pero me da error segmentación fault: 11.
Alguien podría decirme como solucionarlo?

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define BUFFER_TAMAINA 512

int main(int argc, const char * argv[])
{
   int a;
   int f,k;
   char buff[BUFFER_TAMAINA];
   FILE *f1;

   struct stat *stat1;

   if (argc==3)
    {

       if (strcmp(argv[2],"0")!=0 && atoi(argv[2])==0)
       {
         write(1, "Arazoa, posizioa ez da zenbaki bat\n", 36);
         exit(1);
      }

      f1=fopen(argv[1], "r+");

      if(errno==ENOENT)
      {
         write(1, "Fitxategia ez da exititzen\n", 28);
         exit(1);
      }
      while(fgetc(f1)!=EOF){k++;}
      fclose(f1);

      if((atoi(argv[2]))>k)
      {
         write(1,"Posizio altuegia ezarri da\n",28);
         exit(1);
      }
   
      if(atoi(argv[2])<0){
         write(1, "Arazoa, posizioa negatiboa da\n", 31);
         exit(1);
      }


      f = open(argv[1], O_WRONLY,00777);

      if(errno==ENOENT){
         write(1, "Fitxategia ez da exititzen\n", 28);
         exit(1);
      }

      lseek(f, atoi(argv[2]), SEEK_SET);

      while ((a=read(0,buff,BUFFER_TAMAINA))>0)
      {   
         if(stat(argv[1],&*stat1) != NULL)
         { 
            write(f,buff,a);
            printf("Información:\n",argv[1]);
                                printf("---------------------------\n");
                                printf("Tamaño: \t \t %d bytes\n", stat1->st_size);
                                printf("Links: \t%d\n", stat1->st_nlink);
                                printf("inode: \t \t %d\n", stat1->st_ino);
                        
                    }
      
      }

      close(f);
   }
    else
    {
           write(1,"Erabilera: ./idatzi_fitx [fitxategia] [posizioa]\n",50);
    }
}

srWhiteSkull

#1
No tienes que definir un puntero a esa estructura, sólo una variable. Luego al segundo argumento de stat() tienes que indicarle a donde apunta la variable(pasar por referencia &), su dirección en memoria, para que dicha función escriba en esa zona y rellene los campos de la estructura.

El valor devuelto es mayor de -1 si tiene éxito.

Para acceder a los miembros de una estructura se usa el punto y no la flecha.

Algunos valores hay que castearlos(casting) para mostrarlos correctamente y usar el código de formato adecuado.

Tienes que usar la etiqueta pertinente para mostrar correctamente el código en el hilo.