2016-12-02 12 views
0

Мне интересно, как использовать системные вызовы read() и write() в C. Я пытаюсь прочитать содержимое предварительно существующего файла в каталоге, в buffer (array), поэтому я могу пройти через массив и определить, какой тип файла был прочитан. Я просмотрел несколько разных постов по этому вопросу и не смог понять, где я ошибаюсь. Я пытаюсь распечатать свой буферный массив внизу, чтобы убедиться, что он содержит правильное содержимое файла перед тем, как сделать шаг, чтобы определить тип файла, но буфер не содержит ничего. Любая помощь будет принята с благодарностью.системные вызовы читать и писать в 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, что приводит к тому, что запись не передает ничего в буфер. Я верю, что while 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, ect.Таким образом, я мог читать файлы ELF, текстовые файлы или двоичные файлы с тем же массивом. –

+0

@ Mr.Triangle Затем сделайте это либо 'char * buf;', либо 'void * buf;' и malloc buffer. Если вы хотите сделать запись типа над буфером, вероятно, необходимо использовать динамическую память или вы рискуете нарушить правила сглаживания C. 'void *' и 'char *' в основном эквивалентны, но void * имеет неявные преобразования и от указателей к другим типам. – PSkocik

0

Я был в состоянии понять, что происходит не так, я должен изменить массив Buf на массив символов, но я имел некоторые неправильные представления о том, как работает чтение. Я, однако, что read() читал байты из файла и хранил его в массиве temp, поэтому я подумал, что мне нужно использовать write() для записи информации из массива temp в указанный мною массив. На самом деле read() прочитал указанный файл и сохранил его содержимое непосредственно в моем массиве char buf [1024], поэтому вызов write() фактически переписывал всю информацию read(), прочитанную из указанного файла и сохраненную в массиве char buf [1024].

Спасибо всем за ответ, я только разместил здесь 1 в другой раз, поэтому я все еще пытаюсь выяснить, как объяснить проблемы, с которыми я сталкиваюсь с меньшей двусмысленностью.

Смежные вопросы