Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> точка и 2 точки, как их проигнорировать? 
:(
    Опции темы
mclight
Дата 14.7.2005, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 6.7.2005
Где: Baku, Azerbaijan

Репутация: нет
Всего: 2



Цитата

DIR *d;
struct dirent *ent;
int i;

d=opendir(".");
if(!d) return;
while((ent=readdir(d))!=NULL){
    if(ent->d_name=="."||ent->d_name=="..")continue;
    printf("%s\n",ent->d_name);
    }



почему выводит . и ..

вроде
if(ent->d_name=="."||ent->d_name=="..")continue;
должна их игнорироваь или нет?
--------------------
Как я решал подводные камни Cakephp и не только
PM WWW ICQ MSN   Вверх
Mayk
Дата 14.7.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Способ 1-ый. Быстрый.
if(ent->d_name[0]=='.')continue;
Способ второй. Правильный.
if(ent->d_name[0]=='.' && (ent->d_name[1]==0 || (ent->d_name[1]=='.' && ent->d_name[2]==0)))continue;


Цитата(mclight @ 14.7.2005, 16:47)
вроде
if(ent->d_name=="."||ent->d_name=="..")continue;
должна их игнорироваь или нет?

Нет, тут идёт сравнение двух указателей(указатель на статичекскую переменную "." и указатель на строку ent->d_name), а не сравнение строк. Для сравнения строк необходимо использовать одну из функций strcmp

Это сообщение отредактировал(а) Mayk - 14.7.2005, 15:54


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mclight
Дата 14.7.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 6.7.2005
Где: Baku, Azerbaijan

Репутация: нет
Всего: 2



огромное спасибо!
но тут возникла еще одна проблема(вернее она раньше тоже была

if(!(attrib & FA_DIREC))continue;

проблема в том же или нет?
Добавлено @ 16:08
Цитата

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <SysUtils.hpp>
#include <dir.h>
#include <io.h>

int get_file_attrib(char *filename);

void PrintTree(int level=1)
{
DIR *d;
struct dirent *ent;
int i, attrib;

d=opendir(".");
if(!d) return;
while((ent=readdir(d))!=NULL){
     attrib = get_file_attrib(ent->d_name);
     if(ent->d_name[0]=='.' && (ent->d_name[1]==0 || (ent->d_name[1]=='.' && ent->d_name[2]==0)))continue;
     if(!(attrib & FA_DIREC))continue;
     for(i=0;i<level;i++) printf("--|");
     printf("%s\n",ent->d_name);
     if(!chdir(ent->d_name))continue;
     PrintTree(level+1);
     chdir("..");
     }
closedir(d);
}

int get_file_attrib(char *filename)
{
   return(_rtl_chmod(filename, 0));
}

void main(int argc,char *argv[])
{
   if (argc != 2)
   {
     printf("usage: opendir dirname\n");
     exit(1);
   }
   chdir(argv[1]);
   PrintTree();
   exit(0);
}


программа должна выводить дерево каталогов но так не происходит.
скажите что здесь не так.

Это сообщение отредактировал(а) mclight - 14.7.2005, 22:30
--------------------
Как я решал подводные камни Cakephp и не только
PM WWW ICQ MSN   Вверх
Mayk
Дата 14.7.2005, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



1ый printf(который после if(!(attrib & FA_DIREC))continue)стоит закомментировать, тогда вывод станет корректнее. Или проблема в другом?



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mclight
Дата 14.7.2005, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 6.7.2005
Где: Baku, Azerbaijan

Репутация: нет
Всего: 2



да нет это просто опечатка естественно 1printf а нету вообще
вот в РНР есть is_dir($d), а ине нужен ее аналог в С++.
--------------------
Как я решал подводные камни Cakephp и не только
PM WWW ICQ MSN   Вверх
LPBOY
Дата 15.7.2005, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



А почему не используешь функции _dos_findfirst, _dos_findnext?
Вот мой вариант:

Код

#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <dos.h>
#include <stdio.h>

char dir_attr =0x10;

char* get_full_path(const char path[], const char filename[])
{
char *buffer=new char[255];
strcpy(buffer, path);
strcat(buffer, "\\");
strcat(buffer, filename);
return buffer;
}

void print_indent(int level)
{
level*=2;
for(int i=0;i<=level;++i) printf(" ");
}

void scan_files(char path[], int level)
{
struct find_t find;
int err=_dos_findfirst(get_full_path(path, "*.*"), 0xffff, &find);
while(!err)
 {
   if(!(find.attrib & dir_attr))
     {
       print_indent(level);
       print_indent(level);
       printf("%s\n", find.name);
     }
   err=_dos_findnext (&find);
 }
}

void scan_dirs(char path[])
{
static int level=0;
++level;
print_indent(level);
printf("%s\n", path);
scan_files(path, level);
struct find_t find;
int err=_dos_findfirst(get_full_path(path, "*.*"), 0xffff, &find);
while(!err)
 {
   if((find.attrib & dir_attr)&&(find.name[0]!='.'))
     {
       char* pdir=get_full_path(path, find.name);
       scan_dirs(pdir);
       --level;
     }
   err=_dos_findnext (&find);
 }
}

int main()
{
scan_dirs("D:\\test2");
getch();
return 0;
}

Проверял в Borlande 3.1. Вроде работает...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
LPBOY
Дата 15.7.2005, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Забыл про очистку памяти. Лучше так:
Код

#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <dos.h>
#include <stdio.h>

const char dir_attr =0x10;

char* get_full_path(const char path[], const char filename[])
{
char *buffer=new char[255];
strcpy(buffer, path);
strcat(buffer, "\\");
strcat(buffer, filename);
return buffer;
}

void print_indent(int level)
{
level*=2;
for(int i=0;i<=level;++i) printf(" ");
}

void scan_files(char path[], int level)
{
struct find_t find;
char *p=get_full_path(path, "*.*");
int err=_dos_findfirst(p, 0xffff, &find);
delete [] p;
while(!err)
 {
   if(!(find.attrib & dir_attr))
     {
       print_indent(level);
       print_indent(level);
       printf("%s\n", find.name);
     }
   err=_dos_findnext (&find);
 }
}

void scan_dirs(char path[])
{
static int level=0;
++level;
print_indent(level);
printf("%s\n", path);
scan_files(path, level);
struct find_t find;
char *p=get_full_path(path, "*.*");
int err=_dos_findfirst(p, 0xffff, &find);
delete [] p;
while(!err)
 {
   if((find.attrib & dir_attr)&&(find.name[0]!='.'))
     {
       char* pdir=get_full_path(path, find.name);
       scan_dirs(pdir);
       --level;
       delete [] pdir;
     }
   err=_dos_findnext (&find);
 }
}

int main()
{
scan_dirs("D:\\test2");
getch();
return 0;
}

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
mclight
Дата 19.7.2005, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 6.7.2005
Где: Baku, Azerbaijan

Репутация: нет
Всего: 2



Цитата(LPBOY @ 15.7.2005, 04:48)
Проверял в Borlande 3.1. Вроде работает...


а у меня нет
Добавлено @ 10:46
bcc32
--------------------
Как я решал подводные камни Cakephp и не только
PM WWW ICQ MSN   Вверх
Nastya
Дата 21.7.2005, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



strcmp


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.