Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Помогите найти загвоздку в циклах

Ответить
Настройки темы
C/C++ - Помогите найти загвоздку в циклах

Аватара для Apock

Пользователь


Сообщения: 75
Благодарности: 3

Профиль | Отправить PM | Цитировать


Есть следующая задача: получить из определённой папки список вложенных в неё папок(один уровень). В них находятся текстовые документы. Нужно, при нажатии на кнопку, внести в базу полные пути файлов и количество их строк из некоторых вложенных папок. Делается всё в С++ Builder 6.0.
Код: Выделить весь код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TStringList *list = new TStringList;                 //для хранения содержимого файла
 int cnt;                                                           //число строк в файле
 int i=0;                                                           //для цикла while
 DirectoryListBox1->Directory=direct;             //установка начальной папки, заранее определённой в direct
 while(i < DirectoryListBox1->Count)
 {
  dir=DirectoryListBox1->Items->Strings[i];    //берём по очереди названия вложенных папок
  if(dir[1]='2')                                                  //нам нужны только папки, начинающиеся на "2" 
  {
   FileListBox1->Directory=direct+"\\"+dir;     //получаем список файлов в папке
   for(int z=0; z<FileListBox1->Count; z++)   //приступаем к их обработке
   {
    list->LoadFromFile(DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z]);  //получаем содержимое файла
    cnt=list->Count;                                                                                                                 //считаем кол-во строк
    ADOTable1->Insert();                                                                                                         //добавляем данные в базу
    ADOTable1->FieldByName("FilePath")->AsString=DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z];
    ADOTable1->FieldByName("Lines")->AsInteger=cnt;
    ADOTable1->Post();
   }
  }
  i++;
 }
}
Проблема в том, что в базу вносятся только файлы из первой папки, начинающейся с "2". В моём случае таких папок 5. Думал проблема с вложенными циклами(изначально оба были for). Поменял на while - не помогло.
Поставил в конце первого цикла вывод переменной i на Label и секундную паузу, чтоб проследить за выполнением цикла. DirectoryListBox1 содержит 11 папок. При запуске цикла программа некоторое время не отвечает, затем цикл закрывается, на Label цифра 7, а в базе опять таки те же файлы из первой папки.
В принципе проблема решается разделением циклов. Делаем, к примеру, скрытый компонент Memo. В него вносим названия папок первым циклом. Вторым уже пробегаемся по файлам. Так работает, но мне такой подход кажется нерациональным. И интересно всё-таки, что ж за загвоздка в данном коде?

-------
Говорят, что производители чипсетов не стоят на месте. Чушь. Как стоял завод корпорации 3dfx на перекрёстке 7-й авеню и 6-й дежавю, так и стоит.


Отправлено: 22:39, 06-09-2012

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Вот же прям строка кода:
Цитата Apock:
if(dir[1]='2') //нам нужны только папки, начинающиеся на "2" »
Цитата Apock:
Проблема в том, что в базу вносятся только файлы из первой папки, начинающейся с "2". »

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 06:02, 07-09-2012 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Apock

Пользователь


Сообщения: 75
Благодарности: 3

Профиль | Отправить PM | Цитировать


Ну так это условие отбора папок. Нашёл папку, начинающуюся на "2", обработал, занёс в базу. Дальше инкримент увеличивается и в dir должно попасть имя следующей папки из DirectoryListBox1.

-------
Говорят, что производители чипсетов не стоят на месте. Чушь. Как стоял завод корпорации 3dfx на перекрёстке 7-й авеню и 6-й дежавю, так и стоит.


Отправлено: 12:09, 07-09-2012 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Apock, а можно заполучить проект (пусть урезанный) и тестовый набор папок?
Я хоть трассировку сделаю.


P.S. В воскресенье я исчезну на неделю. Т.ч. времени совсем чуть-чуть или "до послезавтра".

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 12:51, 07-09-2012 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Я вот может что-то не понимаю.
Цитата Apock:
if(dir[1]='2') »
Это начинается на '2' или второй символ '2'? А ещё
явный выход за границы (не проверяется, достаточно ли в строке символов). Хотя в борландовской строке вроде оператор [] выдаёт исключение, если что-то не так.

Отправлено: 13:36, 07-09-2012 | #5


Аватара для Apock

Пользователь


Сообщения: 75
Благодарности: 3

Профиль | Отправить PM | Цитировать


dir - строка AnsiString, которой присваивается имя каталога. [1] - указатель на первый символ строки.
Имена папок пустыми быть не могут, поэтому проверять число символов в принципе не важно.

Вообще правильнее будет dir[1]=='2'. Исправил, но это не даёт нужного результата.

Что-то вообще запутался. На втором пк стоит c++ builder XE. Перенёс проект туда. Он ищет файлы в папке на уровень выше почему-то, а их там естественно нет. Пришлось изменить строку
Цитата Apock:
DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z] »
на DirectoryListBox1->Directory+"\\"+dir+"\\"+FileListBox1->Items->Strings[z].
После этого поиск прошёл правильно и в базу попали файлы из всех папок.
Этого момента с папками так и не понял, но получается, что всё-таки проблема какая-то с работой вложенных друг в друга циклах для Builder6 есть.

-------
Говорят, что производители чипсетов не стоят на месте. Чушь. Как стоял завод корпорации 3dfx на перекрёстке 7-й авеню и 6-й дежавю, так и стоит.


Отправлено: 16:30, 08-09-2012 | #6


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Apock,
Цитата lxa85:
можно заполучить проект (пусть урезанный) и тестовый набор папок? »
Мне действительно лень писать проект с нуля и создавать иерархию папок, что бы проверить цикл.
Будет исходник и проверочные данные - проблем нет.
В противном случае, я найду чем заняться. Без обид, но вы не способствуете тому, чтобы мы вам помогли.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:29, 08-09-2012 | #7


Аватара для Apock

Пользователь


Сообщения: 75
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip ProjectTest.zip
(26.6 Kb, 4 просмотров)

Это я да, тормознул чего-то. Занялся тестами на BuilderXE и забыл обо всём.
Внутри файлик с комментами.

-------
Говорят, что производители чипсетов не стоят на месте. Чушь. Как стоял завод корпорации 3dfx на перекрёстке 7-й авеню и 6-й дежавю, так и стоит.


Отправлено: 15:18, 09-09-2012 | #8


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Проект скачал. Как появится окно(ориентировочно в воскресенье после обеда), посмотрю, что да как.

Отправлено: 01:13, 15-09-2012 | #9


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата Apock:
dir - строка AnsiString, которой присваивается имя каталога. [1] - указатель на первый символ строки. »
Вообще-то индекс [1] указывает на второй элемент массива. Не забывайте, что нумерация идёт с нуля, то есть "первым" (для человека некомпьютерного) элементом массива является элемент со смещением [0]

Цитата Apock:
Делаем, к примеру, скрытый компонент Memo. »
Зачем? Чтобы сохранить список строк достаточно создать объект класса TStringList.

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 04:05, 17-09-2012 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Помогите найти загвоздку в циклах

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Помогите найти mp3 united Хочу все знать 9 15-10-2008 17:41
Помогите найти Dj Dynamite Мобильные ОС, смартфоны и планшеты 4 07-05-2006 19:02
Помогите найти Dj Dynamite Мобильные ОС, смартфоны и планшеты 5 09-10-2004 22:31




 
Переход