使用系统调用进行读写

时间:2011-08-20 06:36:09

标签: c

我必须使用读取文件并使用系统调用将信息写入另一个文件。我已打开文件进行阅读,如下所示     filedesc = open(argv[1],O_RDONLY); //which works fine 打开一个文件写如下:     fdw=creat(strcat(store,argv[1]),PERMS) // PERMS 0666 使用lseek到达文件filedesc(反向和打印)

 #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);



            }

问题:如果我在没有第一个参数的情况下运行它,它会给出分段错误而不是使用。请帮忙

1 个答案:

答案 0 :(得分:1)

您的if行错了。它实际上将比较结果存储在fdw中,而不是存储creat(2)的结果。

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

尝试:

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

修改

您还应该检查read的结果:

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