2015-03-04 5 views
0

После долгого времени поиска решения я должен попросить вашу драгоценную помощь. Я работаю над программой, которая реализует команду «ls» unix в C. У меня будет только имя файла и его размер. Я посмотрел, что я должен использовать: «stat» и «dirent». Я нашел «решение» в Stackoverflow, но не работал отлично для меня. Таким образом, я могу показать имена файлов в каталоге, но не их размер. Когда я использую GCC, показывает ли: 0 октет (пока оно не пусто) или "Команда Unix «ls» в C

error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘__off_t’ [-Werror=format=] printf("%s - %s", dp->d_name, s->st_size);

"

Мой тестовый код (не чистить):

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <dirent.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <poll.h> 

struct stat statbuf; 
struct dirent *dp; 
struct stat *s; 

int main() 
{ 
DIR *dirp; 
dirp = opendir("/tmp/gestrep"); 

while((dp = readdir(dirp)) !=NULL) 
{ 

    stat(dp->d_name, &statbuf); 
    printf("%s - %s", dp->d_name, s->st_size); 
} 

} 

В факт, я не знаю, как решить проблему с типом формата. Я видел, что могу использовать ftell/fseek, но я не имею права использовать функции FILE *.

Спасибо за все решения :)

+1

возможно дубликат [Использовать Printf для отображения выкл \ _t, nlink \ _t, размер \ _t и другие] (http: // sta ckoverflow.com/questions/1401526/use-printf-to-display-off-t-nlink-t-size-t-and-others) – Kevin

+0

Не передаете ли вы st_size (целочисленный тип) в% s (null- terminated char string)? – tipaye

+0

Первым шагом в отладке является чтение и понимание ошибки. GCC сообщает вам, что именно и где проблема. – Kevin

ответ

1

Вы, конечно, не может выводить значение любого целого типа с кодом формата %s, и сообщение об ошибке вы получаете от НКУ должно быть совершенно ясно.

Posix требует off_t быть псевдонимом для некоторого целого типа, поэтому простое решение (с С11) было бы привести значение к intmax_t (который является самым широким целочисленный тип), а затем использовать j PRINTF модификатор размера формата :

printf("%s - %jd", dp->d_name, (intmax_t)s->st_size); 

вы должны убедиться, что вы включили соответствующий заголовок для intmax_t быть доступны:

#include <stdint.h>