|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Помогите найти загвоздку в циклах |
|
|
C/C++ - Помогите найти загвоздку в циклах
|
![]() Пользователь Сообщения: 75 |
Есть следующая задача: получить из определённой папки список вложенных в неё папок(один уровень). В них находятся текстовые документы. Нужно, при нажатии на кнопку, внести в базу полные пути файлов и количество их строк из некоторых вложенных папок. Делается всё в С++ 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++; } } Поставил в конце первого цикла вывод переменной i на Label и секундную паузу, чтоб проследить за выполнением цикла. DirectoryListBox1 содержит 11 папок. При запуске цикла программа некоторое время не отвечает, затем цикл закрывается, на Label цифра 7, а в базе опять таки те же файлы из первой папки. В принципе проблема решается разделением циклов. Делаем, к примеру, скрытый компонент Memo. В него вносим названия папок первым циклом. Вторым уже пробегаемся по файлам. Так работает, но мне такой подход кажется нерациональным. И интересно всё-таки, что ж за загвоздка в данном коде? |
|
------- Отправлено: 22:39, 06-09-2012 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 06:02, 07-09-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Пользователь Сообщения: 75
|
Профиль | Отправить PM | Цитировать Ну так это условие отбора папок. Нашёл папку, начинающуюся на "2", обработал, занёс в базу. Дальше инкримент увеличивается и в dir должно попасть имя следующей папки из DirectoryListBox1.
|
------- Отправлено: 12:09, 07-09-2012 | #3 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать Apock, а можно заполучить проект (пусть урезанный) и тестовый набор папок?
Я хоть трассировку сделаю. P.S. В воскресенье я исчезну на неделю. Т.ч. времени совсем чуть-чуть или "до послезавтра". |
------- Отправлено: 12:51, 07-09-2012 | #4 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Я вот может что-то не понимаю.
Цитата Apock:
явный выход за границы (не проверяется, достаточно ли в строке символов). Хотя в борландовской строке вроде оператор [] выдаёт исключение, если что-то не так. |
||
Отправлено: 13:36, 07-09-2012 | #5 |
![]() Пользователь Сообщения: 75
|
Профиль | Отправить PM | Цитировать dir - строка AnsiString, которой присваивается имя каталога. [1] - указатель на первый символ строки.
Имена папок пустыми быть не могут, поэтому проверять число символов в принципе не важно. Вообще правильнее будет dir[1]=='2'. Исправил, но это не даёт нужного результата. Что-то вообще запутался. На втором пк стоит c++ builder XE. Перенёс проект туда. Он ищет файлы в папке на уровень выше почему-то, а их там естественно нет. Пришлось изменить строку Цитата Apock:
После этого поиск прошёл правильно и в базу попали файлы из всех папок. Этого момента с папками так и не понял, но получается, что всё-таки проблема какая-то с работой вложенных друг в друга циклах для Builder6 есть. |
|
------- Отправлено: 16:30, 08-09-2012 | #6 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать Apock,
Цитата lxa85:
Будет исходник и проверочные данные - проблем нет. В противном случае, я найду чем заняться. Без обид, но вы не способствуете тому, чтобы мы вам помогли. |
|
------- Отправлено: 19:29, 08-09-2012 | #7 |
![]() Пользователь Сообщения: 75
|
Профиль | Отправить PM | Цитировать Это я да, тормознул чего-то. Занялся тестами на BuilderXE и забыл обо всём.
Внутри файлик с комментами. |
------- Отправлено: 15:18, 09-09-2012 | #8 |
Необычный Сообщения: 4463
|
Профиль | Сайт | Отправить PM | Цитировать Проект скачал. Как появится окно(ориентировочно в воскресенье после обеда), посмотрю, что да как.
|
Отправлено: 01:13, 15-09-2012 | #9 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата Apock:
Цитата Apock:
|
||
------- Отправлено: 04:05, 17-09-2012 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Помогите найти mp3 | united | Хочу все знать | 9 | 15-10-2008 17:41 | |
Помогите найти | Dj Dynamite | Мобильные ОС, смартфоны и планшеты | 4 | 07-05-2006 19:02 | |
Помогите найти | Dj Dynamite | Мобильные ОС, смартфоны и планшеты | 5 | 09-10-2004 22:31 |
|