在c中使用系统调用

时间:2018-04-19 14:04:03

标签: c architecture

我想创建一个程序名称补丁女巫收回一个FILENAME和一个字符串。在文件中有字符串'allis'。我需要更换每次字符串'allis'出现在文本中的字符串我收到了作为输入。 我只需要使用系统调用而不是标准库。

这是关于代码应该是什么样子的示例代码(这只是结构的一个例子,它不是任务,代码写的是“allis”字而不是“hello world”):

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc , char* argv[], char* envp[]) 
{   

   char buf[6];
   int fd = open(argv[1],O_WRONLY,0777);
   if (fd == -1)
      exit(1);
   write(fd,"hello world!\n",13);
   close(fd);


   fd = open(argv[1], O_RDONLY);
   if (fd == -1)
      exit(1);

   read(fd,buf,5);
   buf[5]='\0';
   close(fd);

   fd = open(argv[1],O_WRONLY,0777);
   if (fd == -1)
      exit(1);
   write(fd,"allis",5);
   close(fd);



   return 0;


}

我需要使用系统调用lseek,但我不知道应该如何使用它,因为我不知道'allis'文本中的位置以及如果我作为输入得到的字符串大于'allis'会发生什么我需要将所有文本移动到右侧或其他内容,因为我将覆盖其他文本。

编辑: 我写了一个代码,用char检查char(而不是allis它的shira,它用sergay替换它)它确实有效。并且我试图根据需要更改代码以使用argv [1]和argv [2]并且它没有工作我恢复到最初为我工作的代码,它现在不起作用!!问题是buf不需要5个字符(只有1个) 并且相信我或之前是否有效。

代码:

         #include <sys/types.h>
         #include <sys/stat.h>
         #include <fcntl.h>
          #include <unistd.h>
         #include <stdio.h>
          #define SYS_WRITE 1
         #define STDOUT 1
          extern int system_call();
    int main(int argc , char* argv[], char* envp[]) 
   {    

char buf[5];

int index1=0,index2=0;//the index of the file
int fd1;
int fd = open("file.txt", O_RDONLY);
        if (fd == -1) 
         return 1;
fd1 = open("copytext.txt",O_WRONLY,0777);
     if (fd1 == -1) 
         return 1;

 int i =0; 
while (fd!=-1){//while there is still info to read
    printf("enter the %d loop\n",i);
    i++;
    if(read(fd,buf,5) == 0 ) break;//read 5 chars from the file //buf[5]='\0';//!! not sure about this
    printf("the buffer is: %s\n",buf);         
        if ((buf[0]=='s') && (buf[1]=='h') && (buf[2]=='i') && (buf[3]=='r') && (buf[4]=='a'))// if (strcmp(buf,"shira")==0)//if we found shira
        {
            write(fd1,"sergay",6);//replace shira
            index2 = index2 + 6;
            if(lseek(fd1,index2,SEEK_SET) < 0) break;
           index1 = index1 + 5;//size of shira
            if(lseek(fd,index1,SEEK_SET) < 0) break;
        }
     else {//we did not find shira;

         write(fd1,buf,1);//write only one
         index2++;
         if(lseek(fd1,index2,SEEK_SET) < 0) break;
         index1++;
        if(lseek(fd,index1,SEEK_SET) < 0) break;
     }

}       


 printf("get out of the loop\n");
char buffer[index2];
fd1 = open("copytext.txt", O_RDONLY);
if (fd1 == -1) 
         return 1;
if(lseek(fd1,0,SEEK_SET) < 0)  return 1;
if(read(fd1,buffer,index2) == 0 ) return 1;


   fd = open("file.txt",O_WRONLY,0777);

     if (fd == -1) 
         return 1;
     if(lseek(fd,0,SEEK_SET) < 0) return 1;
     write(fd,buffer,index2);

close(fd);
close(fd1);
return 0;

}

0 个答案:

没有答案