2016-12-28 46 views
1

我的程序(如下)写(与PWRITE())文本PWRITE()写入到文件,并读取(与PREAD())从文件。我的问题是pread函数不能从文件中读取我的文本,关闭函数(程序的最后一部分)有什么问题?结果在第二部分。我的错误在哪里?阅读与PREAD(),并在C

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

    int main() 
    { 

     int fd, nr, nr2, nw, nw2; 
     char fl_nm[]={"file_io/pwrite.txt"}; 
     char buf_wr[]={"hello everyone this is first text\n"}; 
     char buf_wr2[]={"Did you miss me? Don't afraid\n"}; 
     char buf_rd[120]; 
     char buf_rd2[120]; 

     //open file 
     fd = open(fl_nm, O_RDWR|O_CREAT, 0777); 
     nw = pwrite(fd, &buf_wr, strlen(buf_wr), 14); 

     //error checking 
     if(fd == -1){ 
      perror("[error in open]\n"); 
     } 
     else if(nw == -1){ 
      perror("[error in write]\n"); 
     } 
     else{ 

      /*if open and write process are okey, read first write data 
      * from file*/ 
      nr = read(fd, &buf_rd, sizeof(buf_rd)); 

      //display succeeded message about first write and open process 
      printf("[file is opened]\n"); 
      printf("[succeeded write(1) process]\n"); 

      //read process error control 
      if(nr == -1){ 
       perror("[error in read]\n"); 
      } else{ 
      printf("[reading(1) data] from %s\n", fl_nm); 
      printf("[%s]\n", buf_rd); 
      } 

     } 

     //second write process. 
     nw2= pwrite(fd, &buf_wr2, strlen(buf_wr2), 30); 

     //write error checking 
     if(nw2 == -1){ 
      perror("[error in write 2]\n"); 
     }else{ 

      /*if write process is correct 
      * second read process*/ 
      nr2 = read(fd, &buf_rd2, sizeof(buf_rd)); 

      printf("-----------------------------------\n"); 
      printf("[succeeded write(2) process]\n"); 
      printf("[reading(2) data] from %s\n", fl_nm); 
      printf("[%s]\n", buf_rd2); 
     } 

     //close file 
     close(fd); 

     //error checking for close process 
     if(close(fd) == -1){ 
      perror("[error in close]\n"); 
     }else{ 
      printf("[succeeded in close]\n"); 
     } 

     return 0; 
    } 

结果:

$ gcc pwrite.c -o pwrite 
$ ./pwrite 
[file is opened] 
[succeeded write(1) process] 
[reading(1) data] from file_io/pwrite.txt 
[] 
----------------------------------- 
[succeeded write(2) process] 
[reading(2) data] from file_io/pwrite.txt 
[] 
[error in close] 
: Bad file descriptor 
+0

每[标准](http://pubs.opengroup.org/onlinepubs/9699919799/functions/read:

相反,使用一个循环打印每个字节(),'pread()','write()'和'pwrite()'返回'ssize_t',而不是'int'。 –

回答

2

1)close()因为你关闭文件两次失败:

//close file 
close(fd); 

//error check close process 
if(close(fd) == -1){ 

第一次调用close(fd);后,fd变得不确定,并close(fd)第二个呼叫失败。您只需要将第一个电话去掉close(fd);即可。

2)要打印buf_rd,就好像它是一个C-字符串。 read()不会用空字节终止buf_rd

3)你在随机偏移(14和30)使用pwrite()写入。但是read()从当前偏移量读取 - 这意味着起始字节可能为空字节,因此%s立即停止打印(即,不打印任何内容)。你阅读的东西比你写的更多。这意味着read()将返回小于请求的字节数。因此,使用返回值read()来获取成功读取的字节数。

for (size_t l = 0; l < nr; l++) 
    printf("%c", buf_rd[l]); 

for (size_t l = 0; l < nr2; l++) 
    printf("%c", buf_rd2[l]); 
1

您使用指针错误,访问将数组的地址应该是用他们的名字,而不是&名。

取代& buf_wr与buf_wr,访问到不正确的地址与& buf_wr编写会有损坏你的筹码,也变量里面堆定义

编辑:

更换

nw = pwrite(fd, &buf_wr, strlen(buf_wr), 14); 

nw = pwrite(fd, buf_wr, strlen(buf_wr), 14); 

和所有其他实例..

+0

nw = pwrite(fd,buf_wr,strlen(buf_wr),14);依此类推...... –

+0

输出没有变化。它仍然是同样的结果。 – metarose

+0

你替换了所有实例吗?编辑你的文章,并把编辑代码 –