2015-04-16 3 views
2

Я сохранил свою программу в папке, где есть файлов. Теперь я хочу распечатать файлы inode номеров. Вот моя программа:C opendir и readdir и inode

#include <sys/types.h> 
#include <dirent.h> 
#include <stdio.h> 
#include <libgen.h> 
#include <stdlib.h> 
#include <string.h> 

int main(){ 
    DIR *dir; 
    struct dirent *dp; 
    if((dir = opendir(".")) == NULL){ 
     printf ("Cannot open ."); 
     exit(1); 
    } 
    while ((dp = readdir(dir)) != NULL) { 
     printf("%i\n",(*dp).d_ino); 
    } 
} 

и вот мои результаты

251 
250 
332 
254 
257 
328 
274 
283 

Так у меня есть 5 файлов и 8 числа я-узел? Как это возможно?

EDIT: Когда я добавляю печатать эту

printf("%i\n",dp->d_name); 
printf("%i\n",dp->d_ino); 

я получаю этот выход

-27246574 
251 
-27246550 
250 
-27246526 
334 
-27246502 
254 
-27246470 
257 
-27246438 
328 
-27246414 
274 
-27246382 
283 

Так что я думаю, что моя программа не находит файлы в каталоге?

+1

Печать имен файлов ('dp-> d_name') также будет просвещать. Это из-за записей '.' И '..', которые находятся в каждом каталоге. – Ulfalizer

+0

@ Ulfalizer Я думал об одном и том же, но 5 + 2 -> 7, так что все еще не хватает. Может быть, скрытый файл ... @user: возможно, добавьте результат 'ls -la' в ваш каталог – smagnan

+0

@smagnan: Да, dotfile звучит правдоподобно. Или просто опечатка. :) – Ulfalizer

ответ

3

d_name является строкой:

 struct dirent { 
      ino_t   d_ino;  /* inode number */ 
      off_t   d_off;  /* offset to the next dirent */ 
      unsigned short d_reclen; /* length of this record */ 
      unsigned char d_type;  /* type of file; not supported 
              by all file system types */ 
      char   d_name[256]; /* filename */ 
     }; 

Таким образом, вы должны PRINTF его% с, не% I:

printf("%s %i\n",dp->d_name, dp->d_ino); 

Тогда вы увидите, что там.