2015-12-09 5 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 
#include <unistd.h> 
#include <sys/stat.h> 
#include <sys/types.h> 


int main(int argc, char** argv) { 

    struct stat *buf; 
    buf = malloc(sizeof(struct stat)); 

    DIR * current_directory_ptr; /* DIR is a type from dirent.h */ 
    struct dirent * next_entry_ptr; /* struct dirent is a type from dirent.h */ 

    char* dirToView [200]; 

    printf("Enter path of desired directory\n"); 
    scanf("%s)", &dirToView); 

    current_directory_ptr = opendir(dirToView); 

    next_entry_ptr = readdir (current_directory_ptr); 

    while(next_entry_ptr != NULL){ 
     printf("File has inode number %d and is called %s \n", 
      (int) next_entry_ptr ->d_ino, next_entry_ptr->d_name); 
     next_entry_ptr=readdir(current_directory_ptr); 

    } 

    char* fileToView [200]; 
    printf("Enter name of desired file\n"); 
    scanf("%s)", &fileToView); 



    stat(fileToView, buf); 
    off_t size = buf -> st_size; 
    printf("Size = %ld \n", size); 

    uid_t owner = buf ->st_uid; 
    printf("owner = %d \n", owner); 


    closedir(current_directory_ptr); 


    return (EXIT_SUCCESS); 
} 

Цель этого кода - использовать сканирование для получения и вывода информации о выбранном файле. Открытие каталога работает, но когда дело доходит до открытия файла, результат для размера и владельца равен 0 независимо от фактических значений для этого файла. Я считаю, что причиной этого является то, что я печатаю их как неправильный тип, но я не уверен в этом. Какая правильная система выводит результат stat()?Просмотр атрибутов файла со статусом (C)

Редактировать для ясности

вопрос лежит на линии выделены ниже

char* fileToView [200]; 
    printf("Enter name of desired file\n"); 
    scanf("%s)", &fileToView); 

    stat(fileToView, buf); 
    off_t size = buf -> st_size; 
    printf("Size = %ld \n", size); 

    uid_t owner = buf ->st_uid; 
    printf("owner = %d \n", owner); 

код ранее в функциях программы по назначению, по крайней мере один ответ был ссылкой на ранее линий. Приносим извинения за отсутствие ясности.

+1

Не выполняйте 'scanf ("% s) ", & dirToView);' и 'scanf ("% s) ", & FileToView);', которые вызывают несоответствие типов и неопределенное поведение. – MikeCAT

+0

Каков правильный тип в этом случае? Существует ли тип каталога? – 4oursword

+0

Использовать 'char dirToView [200]; scanf ("% 199s)", dirToView); 'и' char fileToView [200]; scanf ("% s)", fileToView); ' – MikeCAT

ответ

2

Правильный способ печати целых чисел неизвестного размера использовать %jd/%ju с промежуточным броском в intmax_t/uintmax_t:

printf("File has inode number %jd and is called %s\n", 
    (intmax_t) next_entry_ptr ->d_ino, next_entry_ptr->d_name); 

intmax_t/uintmax_t определяются как крупнейший неотъемлемыми подписан/беззнаковых типов, которые могут представлять значения любого другого интегрального типа.

Приведение существенно увеличивает целочисленное значение до максимального размера, а затем позволяет сопоставить спецификатор формата и тип портативным способом.

0

Вы действительно должны собрать все предупреждения & отладочной информации (gcc -Wall -Wextra -g при использовании GCC) и прочитайте документацию функций, как scanf(3) & stat(2). Обратите внимание, что оба могут выйти из строя, и вы должны проверить это.

Вы могли бы попробовать, вместо

/// BAD CODE 
char* fileToView [200]; 
printf("Enter name of desired file\n"); 
scanf("%s)", &fileToView); 
stat(fileToView, buf); 
off_t size = buf -> st_size; 
printf("Size = %ld \n", size); 

Что-то лучше, как:

char fileToView[200]; 
memset (fileToView, 0, sizeof(fileToView)); 
printf("Enter name of desired file:\n"); 
if (scanf("%199s", fileToView)<=0) { 
    perror("scanf"); exit(EXIT_FAILURE); } 
struct stat mystat; 
memset (&mystat, 0, sizeof(mystat)); 
if (stat(fileToView, &mystat)) { 
    fprintf(stderr, "stat '%s' failed: %s\n", fileToView, strerror(errno)); 
    exit(EXIT_FAILURE); 
} 
printf("for file '%s' size = %ld\n", fileToView, (long) mystat.st_size); 

Обратите внимание, что я тестирую успех scanf; Я ограничиваю 199 имя ввода (и %s не будет принимать какое-либо пространство, потому что оно перестает сканировать на них); Я назначаю mystat как локальную переменную (нет необходимости выделять ее кучи), и я тестирую сбой stat; ваш fileToView был неправильно объявлен как массив из 200 указателей на char. У меня также есть привычка нулевать все локальные переменные.

BTW, вы можете попробовать strace(1) свою программу. Вы поймете, что делает system calls.

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

  • Нет связанных вопросов^_^