2016-12-28 13 views
1

に私のプログラムは、(下)(PWRITE()で)ファイルにテキストを書き込み、ファイルから(PREAD()で)読み込みます。私の問題は先読み機能がファイルから私のテキストを読み上げるのではなく、近い機能(プログラムの最後の部分)が間違っていますか?結果は2番目の部分にあります。私のミスはどこですか?は)((PREADを読んで)とPWRITEと書き込み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 .html)、 'read()'、 'pread()'、 'write()'、 'pwrite()'は 'int'ではなく' ssize_t'を返します。 –

答えて

2

1)close()が失敗した:

//close file 
close(fd); 

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

close(fd);を最初に呼び出した後、fdは不確定となりclose(fd)への2回目の呼び出し失敗する。 close(fd);への最初の呼び出しを削除するだけです。

2)buf_rdは、C文字列のように印刷されます。 read()はヌルバイトでbuf_rdを終了しません。

3)pwrite()を使用してランダムオフセット(14と30)で書き込みます。しかし、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あなたが二回ファイル を閉じているので、

と、他のすべてのインスタンス...

+0

nw = pwrite(fd、buf_wr、strlen(buf_wr)、14); ... –

+0

出力は変更されませんでした。それは同じ結果です。 – metarose

+0

すべてのインスタンスを置き換えましたか?投稿を編集して編集したコードを入れてください –

関連する問題