2016-12-02 93 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

”一直未能弄清楚我哪里出错了。“好。你没有说过什么是错的。请阅读[问]。 – OldProgrammer

+0

你能解释一下你认为**这个循环做了什么,你认为'read()'和'write()'的参数是(它们中的每一个)? https://gist.github.com/84dac9dc427af987c0a6bee7a7b87477 – yLaguardia

+0

我相信,读取不正确地从myFile-> d_name指定的文件传输bites,其中inturn导致写入将任何内容都传输到缓冲区中。我证明while循环'while((myFile = readdir(myDir))!= NULL)'正在遍历目录,直到所有文件在到达最后一个文件后“已列出”,readdir返回0表示没有目录中的其他项目。所以我认为如果我可以读取单个文件,将它写入缓冲区,对所述文件进行分类,然后while循环将再次迭代,从而允许我对所有文件进行分类,直到所有文件都保留为止。 –

回答

1

你需要一些更小括号在这里:

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

尝试:

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

此外,推荐使用的sizeof:

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

@Triangle然后使它成为'char * buf;'或'void * buf;'和malloc缓冲区。如果你想对缓冲区进行类型窜改,那么可能需要使用动态内存或者冒着违反C的别名规则的风险。 'void *'和'char *'大多是等价的,但void *具有与其他类型的指针之间的隐式转换。 – PSkocik

0

我能够弄清楚发生了什么事情错了,我也得buf数组中改变字符数组,但我有一些关于阅读是如何工作的误解。我虽然read()正在从文件中读取字节并将其存储到临时数组中,所以我认为我需要使用write()将临时数组中的信息写入到我指定的数组中。实际上,read()读取指定的文件并将其内容直接存储到我的char buf [1024]数组中,所以调用write()实际上覆盖了从指定文件中读取的所有信息read(),并存储到char buf [1024]数组中。

谢谢大家的回复,我只在这里发布了另外一个帖子,所以我仍然试图找出如何解释我遇到的问题,不太模糊。 “