Здравствуйте !
Я в Си не силен, поэтому прошу сразу извинить за ламерский вопрос.
Мне нужна програмка на Си, которая бы вывела в консоль имена файлов в каталоге и их размер. Путем долгой медитации с Гуглем и Яндексом родилось у меня следующее уродство:
=======================================================================================
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>int
main (void)
{
DIR *dir;
struct stat st;dir = opendir("/var/log/apache/");
if (!dir) {
printf ("Cannot read directory contents\n");
return 1;
}struct dirent* de;
while( (de = readdir(dir)) != 0 )
{if (strcmp (de->d_name, ".") == 0 || strcmp (de->d_name, "..") == 0) continue;
stat(strcat("/var/log/apache/",strrchr(de->d_name,'\0')), &st);
printf("File: %s Size: %d bytes\n", de->d_name, st.st_size);}
closedir(dir);
return 0;
}
=======================================================================================
Мое твареньице успешно компилируется, но работать не хочет - система (FreeBSD) сообщает:
Bus error (core dumped)
и на этом все заканчивается.
Вся беда, судя по всему, находится в этой строке:
stat(strcat("/var/log/apache/",strrchr(de->d_name,'\0')), &st);
ибо если ее закоментировать - то программа работает, но, ессно, не дает нужного результата.
Помогите, пожалуйста, победить эту напасть.
> stat(strcat("/var/log/apache/",strrchr(de->d_name,'\0')), &st);
тут две ошибки
1. делаешь strcat к константной строке.
2. зачем-то вызываешь strrchr да еще с неправильными параметрамиисправляем:
char filename[NAME_MAX + 100]; // по хорошему не так надо, но для этого примера сгодится. strcpy(filename, "/var/log/apache/"); //поместили каталог
strcat(filename, de->d_name); // добавили имя
if (!stat(filename, &st))
//printf
else
//error
p.s. Прочти книгу Кернигана и Ричи (она тоненькая) и все станет ясно.
упс пример поехал))char filename[NAME_MAX + 100]; // по хорошему не так надо, но для этого примера сгодится.
strcpy(filename, "/var/log/apache/"); //поместили каталог
strcat(filename, de->d_name); // добавили имя
if (!stat(filename, &st))
//printf
else
//error
>p.s. Прочти книгу Кернигана и Ричи (она тоненькая) и все станет ясно.А если не сложно, не утоните, какую именно и (в идеале) где продаётся (Москва).
Интересно, как вы не догадались посмотреть исходники команды ls :)
>Интересно, как вы не догадались посмотреть исходники команды ls :)По каждому чиху лезть в исходники тоже не гуд..
Книга: http://www.ozon.ru/context/detail/id/96537/
должна быть в любом магазине где есть нормальный компьютерный отдел.
>Интересно, как вы не догадались посмотреть исходники команды ls :)Да смотрел, вот тока поиском не нашел там ни вызова функции opendir, ни вызова функции stat.
>>Интересно, как вы не догадались посмотреть исходники команды ls :)
>
>Да смотрел, вот тока поиском не нашел там ни вызова функции opendir,
>ни вызова функции stat.Эти функции системные их искать не нужно :) достаточно man opendir и man 2 stat.
Ошибки не связаны с этими функциями, а связаны с непониманием что есть C-строки, как с ними работать, как выделять память, как такие строки копировать, именно поэтому и зашел разговор про книгу авторов языка :)Удачи.
>Эти функции системные их искать не нужно :) достаточно man opendir и
>man 2 stat.
Да в мане написано без примеров и по англицки.
Думал - в исходниках можно будет содрать готовый вариант, да не тут-то было, в гугле и то больше инфы...
>тут две ошибки
>1. делаешь strcat к константной строке.
>2. зачем-то вызываешь strrchr да еще с неправильными параметрамиСПАСИБО !!!!