f-z-N
f-z-N

Reputation: 1807

Reading and writing using system calls

I have to use read a file and write the information to another file using system call. I have opened the file for reading as below
filedesc = open(argv[1],O_RDONLY); //which works fine opened a file to write as below: fdw=creat(strcat(store,argv[1]),PERMS) // PERMS 0666 Used lseek to reach to the one of file filedesc ( to reverse and print )

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

 int main(int argc, char *argv [ ])
  {

     int filedesc,n,i,fdw,pos;
     char c;
     const char * prefix = "reserve_";
     int needed = strlen( argv[ 1 ] ) + strlen( prefix ) + 1;
     char store[ needed ];
     strcpy( store, prefix );

     if(argc != 2)
   {
       printf(" usage : %s filename ", argv[0]);
     }

         //strcat( store, argv[ 1 ] );
         //printf( "%s\n", store );


      filedesc =  open(argv[1],O_RDONLY);
         if(filedesc <1 )
            {  printf("Unable to open file\n");
          exit(1); }


     if((fdw=creat(strcat(store,argv[1]),PERMS))==-1)
      printf("Unable to create file,please use perror to find details\n");
    else printf("File created\n");



       if((pos=lseek(filedesc,0,SEEK_END))==0)
         {
           printf("Empty file\n");
            exit(-1);
           }
         i=pos-1; 
             //printf("%d",i);

            while(i!=0)
             {
             pos=lseek(filedesc,i-1,SEEK_SET);
              read(filedesc,&c,1);
              if( write(fdw,&c,1)!=1)  //information is not being written to the file
                printf("Error\n");     //pointed by fdw rather getting printed on the
                                       //screen
                i--;                     
            }

        close(filedesc);
          close(fdw);



            }

Problem: If i am running this without first argument, it gives a segmentation fault instead of the usage. Please help

Upvotes: 1

Views: 2727

Answers (1)

cnicutar
cnicutar

Reputation: 182619

Your if line is wrong. It will actually store the result of the comparison in fdw instead of storing the result of creat(2).

if(fdw=creat(strcat(store,argv[1]),PERMS)==-1) /* Wrong. */

Try:

if((fdw = creat(strcat(store, argv[1]), PERMS)) == -1)
   ^                                          ^

EDIT

You should also check the result of read:

if (read(filedesc, &c, 1) <= 0)
    break;

Upvotes: 1

Related Questions