Помогите с задачкой
Проверьте пожалуйста код?
Цитата:
од
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>
int minsize;
int maxsize;
FILE *out = NULL;
int i=0;
void find(char const *dirname,int minsize,int maxsize,FILE *out);
{
DIR *dr=opendir (const char *dirname);
if (dr==NULL)
{
fprintf(stderr,"Невозможно открыть директорию \"%s\"",dirname);
fclose(out);
errno = ENOENT;
perror(", ");
return -1; exit(1);
}
struct dirent *dt;
while((dt=readdir(dr)))
{
if(dt->d_type=DT_DIR) {find();}
if(dt->d_type=DT_REG)
{
if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize)))
{
fprintf(out,"%-40s %-10jd %s\n",filename, (intmax_t) dt->st_size);
i=i+1;
}
}
}
return 0;
}
int main (int argc,char* argv[])
{
if (argc != 5)
{
fprintf(stderr,"Не все параметры заданы\n");
errno = EINVAL; //invalid arguments
perror(argv[0]);
printf("формат: нач_размер кон_размер папка имя_файла\n");
return -1;
}
out = fopen (argv[4],"w+");
if ( out == NULL)
{
printf("NULL\n");
fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
perror(", ");
return -1;
}
DIR *dr = opendir(argv[3]);
if (dr == NULL)
{
fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
fclose(out);
errno = ENOENT;// no such file or directory
perror(", ");
return -1;
}
minsize = atol(argv[1]);
maxsize = atol(argv[2]);
dirname = argv[3]
find(*dirname,minsize, maxsize, FILE *out);
printf ("Число просмотренных файлов равно %d\n", i);
closedir(dr);
fclose(out);
return 0;
}
в смысле проверьте? ты ее компилил? компилится? запускал? работает? какие еще тогда проверки???
я его не могу скомпилировать, нету среды, а ошибки там есть, поэтому и прошу у вас помощи как у опытных
Код:
g++ file.cpp
писал gcc файл и !gcc файл ничего не компилировал
Код:
// вместо
if(dt->d_type[COLOR="Red"]=[/COLOR]DT_DIR) {find();}
if(dt->d_type[COLOR="Red"]=[/COLOR]DT_REG)
// нужно
if(dt->d_type[COLOR="Red"]==[/COLOR]DT_DIR) {find();}
if(dt->d_type[COLOR="Red"]==[/COLOR]DT_REG)
if(dt->d_type[COLOR="Red"]=[/COLOR]DT_DIR) {find();}
if(dt->d_type[COLOR="Red"]=[/COLOR]DT_REG)
// нужно
if(dt->d_type[COLOR="Red"]==[/COLOR]DT_DIR) {find();}
if(dt->d_type[COLOR="Red"]==[/COLOR]DT_REG)
За названия переменных minsize, maxsize - хвалю. А вот название i неудачное. Лучше что-то вроде count.
Зачем minsize, maxsize, *out сделаны глобальными? Ведь в функцию find они передаются как параметры, стало быть лучше объявить их в функции main.
Количество просмотренных файлов лучше получать не через глобальную переменную, а через возвращаемое значение функции:
Код:
int find(char const *dirname,int minsize,int maxsize,FILE *out) // [COLOR="Red"];[/COLOR] - здесь лишний знак точка с запятой
{
int count = 0;
//...
return count;
}
int main (int argc,char* argv[])
{
int minsize, maxsize;
FILE *out = NULL;
//...
int count = find(*dirname,minsize, maxsize, FILE *out);
//...
}
{
int count = 0;
//...
return count;
}
int main (int argc,char* argv[])
{
int minsize, maxsize;
FILE *out = NULL;
//...
int count = find(*dirname,minsize, maxsize, FILE *out);
//...
}
Большое Вам спасибо, а как размер файла? мне сказали что нужно использовать stat И еще одно, нужно передать параметры в рекурсию функцию find Подправлю исходник.
Код:
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>
int count = 0;
void find(char const *dirname,int minsize,int maxsize,FILE *out);
{
DIR *dr=opendir (const char *dirname);
if (dr==NULL)
{
fprintf(stderr,"Невозможно открыть директорию \"%s\"",dirname);
fclose(out);
errno = ENOENT;
perror(", ");
return -1; exit(1);
}
struct dirent *dt=readdir(dr);
while(dt)
{
if(dt->d_type==DT_DIR)
{
find();
}
if(dt->d_type==DT_REG)
{
if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize)))
{
fprintf(out,"%-40s %-10jd %s\n",filename, (intmax_t) dt->st_size);
count=count+1;
}
}
}
return count;
}
int main (int argc,char* argv[])
{
int minsize, maxsize;
FILE *out = NULL;
if (argc != 5)
{
fprintf(stderr,"Не все параметры заданы\n");
errno = EINVAL; //invalid arguments
perror(argv[0]);
printf("формат: нач_размер кон_размер папка имя_файла\n");
return -1;
}
out = fopen (argv[4],"w+");
if ( out == NULL)
{
printf("NULL\n");
fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
perror(", ");
return -1;
}
DIR *dr = opendir(argv[3]);
if (dr == NULL)
{
fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
fclose(out);
errno = ENOENT;// no such file or directory
perror(", ");
return -1;
}
minsize = atol(argv[1]);
maxsize = atol(argv[2]);
dirname = argv[3]
int count = find(*dirname,minsize, maxsize, FILE *out);
printf ("Число просмотренных файлов равно %d\n", count);
closedir(dr);
fclose(out);
return 0;
}
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>
int count = 0;
void find(char const *dirname,int minsize,int maxsize,FILE *out);
{
DIR *dr=opendir (const char *dirname);
if (dr==NULL)
{
fprintf(stderr,"Невозможно открыть директорию \"%s\"",dirname);
fclose(out);
errno = ENOENT;
perror(", ");
return -1; exit(1);
}
struct dirent *dt=readdir(dr);
while(dt)
{
if(dt->d_type==DT_DIR)
{
find();
}
if(dt->d_type==DT_REG)
{
if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize)))
{
fprintf(out,"%-40s %-10jd %s\n",filename, (intmax_t) dt->st_size);
count=count+1;
}
}
}
return count;
}
int main (int argc,char* argv[])
{
int minsize, maxsize;
FILE *out = NULL;
if (argc != 5)
{
fprintf(stderr,"Не все параметры заданы\n");
errno = EINVAL; //invalid arguments
perror(argv[0]);
printf("формат: нач_размер кон_размер папка имя_файла\n");
return -1;
}
out = fopen (argv[4],"w+");
if ( out == NULL)
{
printf("NULL\n");
fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
perror(", ");
return -1;
}
DIR *dr = opendir(argv[3]);
if (dr == NULL)
{
fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
fclose(out);
errno = ENOENT;// no such file or directory
perror(", ");
return -1;
}
minsize = atol(argv[1]);
maxsize = atol(argv[2]);
dirname = argv[3]
int count = find(*dirname,minsize, maxsize, FILE *out);
printf ("Число просмотренных файлов равно %d\n", count);
closedir(dr);
fclose(out);
return 0;
}
только тут еще есть такие ошибки:
if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize))) где dt должно быть структурой stat и необходимо передать параметры рекурсии find();
лень все таки страшная сила, проще написать на форум и ждать ответа, чем сделать
Код:
sudo apt-get install codelite, codeblocks, anjuta, .....(или еще чего, по вкусу)
и наслаждать вменяемой средой разработки!:)
Цитата: Artem_3A
[оффтоп]
лень все таки страшная сила, проще написать на форум и ждать ответа, чем сделать
и наслаждать вменяемой средой разработки!:)
лень все таки страшная сила, проще написать на форум и ждать ответа, чем сделать
Код:
sudo apt-get install codelite, codeblocks, anjuta, .....(или еще чего, по вкусу)
и наслаждать вменяемой средой разработки!:)
sudo apt-get install vim
тратим 2-3 дня на начальную настройку и освоение, и наслаждаемся:)