2016-12-02 18 views
0

Cでread()とwrite()を呼び出す方法を知りたいです。 ディレクトリ内の既存のファイルの内容を読み込みしようとしています。バッファ(配列)ので、配列をステップ実行して、読み込まれたファイルのタイプを判断できます。私はこの問題に関するいくつかの異なる投稿を見てきて、私がどこに間違っているのか理解できなかった。私はファイルの種類を決定するためにステップする前に、ファイルの正しい内容を保持していることを確認するために、バッファの配列を一番下に印刷しようとしていますが、バッファには何も格納されていません。どんな助けでも大歓迎です。システムコールのC言語での読み込みと書き込み

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/unistd.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    char *currentDir = NULL; 
    DIR *myDir = NULL; 
    struct dirent *myFile = NULL; 
    struct stat myStat; 

    const void *buf [1024]; 

    int count; 
    int currentFile; 

    if (strcmp(argv[1], "ls") == 0 && argc < 3) 
    { 
     currentDir = getenv("PWD"); 
     myDir = opendir(currentDir); 

     while ((myFile = readdir(myDir)) != NULL) 
     { 
      if (myFile->d_name[0] != '.') 
      { 
       puts(myFile->d_name); 
       //printf("%s\n", myFile->d_name); 
      } 
     } 
     closedir(myDir); 
    } 

     if (strcmp(argv[1], "ls") == 0 && strcmp(argv[2], "-t") == 0) 
     { 
      currentDir = getenv("PWD"); 
      myDir = opendir(currentDir); 

      while ((myFile = readdir(myDir)) != NULL) 
      { 
       if (myFile->d_name[0] != '.') 
       { 
        printf("%s\n", myFile->d_name); 
        stat (myFile->d_name, &myStat); 
        printf("Last Accessed:\t%s\n", ctime(&myStat.st_atime)); 
        printf("Last Modified:\t%s\n", ctime(&myStat.st_mtime)); 
        printf("Last Changed:\t%s\n", ctime(&myStat.st_ctime)); 
       } 
      } 
      closedir(myDir); 
     } 

      if (strcmp(argv[1], "ls") == 0 && strcmp(argv[2], "-f") == 0) 
      { 
       currentDir = getenv("PWD"); 
       myDir = opendir(currentDir); 

       while ((myFile = readdir(myDir)) != NULL) 
       { 
        //while (count = read(0, buf, 100) > 0) 
        //{ 

        //} 
        //write (1, buf, 100); 
        //printf ("Buffer Holds:\n %s\n", buf); 
        if (myFile->d_name[0] != '.') 
        { 
         while (count = read(myFile->d_name, buf, 100) > 0) 
          write (1, buf, count); 

         printf ("Buffer Holds:\n %s\n", buf); 
        } 
       } 
      } 
    return 0; 
} 
+0

「どこに間違っているのかわからない」まあ。あなたは何が間違っているかは言わなかった。 [ask]をお読みください。 – OldProgrammer

+0

あなたは**このループが何をしていると思うかを正確に説明できますか? 'read()'と 'write()'の引数は(それぞれのもの)と思いますか? https://gist.github.com/84dac9dc427af987c0a6bee7a7b87477 – yLaguardia

+0

私は、読み込みがmyFile-> d_nameで指定されたファイルからビットを正しく送信していないと考えています。これは、inturnが書き込みにバッファに何も送信しないようにしています。私は最後のファイルに到達した後、すべてのファイルが "リスト"されるまで、whileループ 'while((myFile = readdir(myDir)!= NULL)'がディレクトリを踏んでいることを証明しています。ディレクトリ内の他の項目だから、もし私が1つのファイルを読み込み、バッファに書き込んだり、そのファイルを分類したりすると、whileループが繰り返されて、何も残らなくなるまですべてのファイルを分類できるようになります。 –

答えて

1

あなたがここにいくつかのより多くの括弧が必要ですはsizeofを使用することをお勧めし、また

while ((count = read(myFile->d_name, buf, 100)) > 0) 

:試し

while (count = read(myFile->d_name, buf, 100) > 0) 

while ((count = read(myFile->d_name, buf, sizeof(buf))) > 0) 

しかし、あなたはbufとして宣言しましたポインタの配列:

const void *buf [1024]; 

あなたが実際に望むものとは思われません。実際にポインタ値がファイルに格納されていますか?私は、あなたはおそらく文字の配列であることをbufのためのものだと思う:

char buf[1024]; 
+0

ありがとう、私はこれらの変更を行います。 'const void * buf [1024]'の私の推論は、私がbufにvoidポインタを作れば、すべての型を受け入れることができると思ったということでした。私はこれにより、ファイルを読み込み、バッファに必要な型、つまりchar、int、longなどを書くことができると考えました。そうすれば、同じ配列のELFファイル、テキストファイル、バイナリファイルを読むことができます。 –

+0

@ Mr.Triangle次に、 'char * buf;'または 'void * buf;'とし、バッファをmallocします。バッファを介して型打ちする場合は、おそらく動的メモリを使用する必要があります。そうしないと、Cのエイリアシング規則に違反する危険性があります。 'void *'と 'char *'はほとんど同じですが、void *は他の型へのポインタへの暗黙的な変換を行います。 – PSkocik

0

私はcharの配列にBUF配列を変更する必要がなかった、間違って何が起こっていたかを把握することができたが、私はいくつかを持っていました読書の仕組みに関する誤解。私はread()がファイルからバイトを読み込んでそれを一時配列に格納していたので、私はwrite()を使用して、指定した配列に一時配列の情報を書き込む必要があると考えました。実際には、read()は、指定されたファイルを読み込んでその内容を直接char buf [1024]の配列に格納していたので、read()が実際にすべての情報を上書きしてchar buf [1024]配列に格納されました。

返信いただきありがとうございます。私はここに1回しか投稿していませんので、あまり曖昧さのない問題を説明する方法をまだ試しています。

関連する問題