2016-07-25 10 views
0

私はファイルを書き終えた後にたくさんのガベージ文字を書いていますが、それは私が欲しいものではありません。ファイルの読み込みが終了したらどうすれば終了できますか?write(2)ファイルを書き終えた後にガーベジ文字を書き込む

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

using std::cerr; 
using std::endl; 

const int BUFF_SIZE = 4096; 

int main (int argc, char* argv[]) { 
    if (argc < 2) { 
     cerr << "Usage:\t./cat FILE ..." << endl; 
     return EXIT_FAILURE; 
    } // if 

    for (int i = 1; i < argc; ++i) { 
     int fd; 
     if ((fd = open(argv[i], O_RDONLY)) == -1) { 
      perror(argv[i]); 
      return EXIT_FAILURE; 
     } // if 

     char buf [BUFF_SIZE]; 
     int r; 

     while ((r = read(fd, buf, BUFF_SIZE-1)) > 0) { 
      buf[BUFF_SIZE-1] = '\0'; 
      if ((write(STDOUT_FILENO, buf, BUFF_SIZE)) == -1) { // the offending line 
       perror(argv[i]); 
       return EXIT_FAILURE; 
      } // if 
     } // while 

     if (r < 0) { 
      perror(argv[i]); 
      return EXIT_FAILURE; 
     } // if 

     if (close(fd) == -1) { 
      perror(argv[i]); 
      return EXIT_FAILURE; 
     } // if 
    } // for 
} // main 
+2

read()は何を返しますか? rとは何ですか?あなたはその情報(bufに関する)で何をすべきですか? write()への呼び出しにどのように影響を与えるべきですか? –

答えて

0

非常に単純です。 readによって返されたカウントを無視しています。無意味なヌル終了を取り除く必要があります。

while ((r = read(fd, buf, BUFF_SIZE)) > 0) { 
    if ((write(STDOUT_FILENO, buf, r)) == -1) { // the fixed line 
     perror(argv[i]); 
     return EXIT_FAILURE; 
    } // if 
} // while 
関連する問題