Reputation: 1807
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
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)
^ ^
You should also check the result of read
:
if (read(filedesc, &c, 1) <= 0)
break;
Upvotes: 1