Форум программистов, компьютерный форум CyberForum.ru

Как можно пройти через бесконечный цикл ??? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 12:30     Как можно пройти через бесконечный цикл ??? #1
У меня случилось что-то вроде парадокса. Прогал я в Eclipse (у него компилятор MinGW, отладчик GDB), напрогал выложенную ниже программу. Компилирую ее, кладу рядом с бинарником файл test.txt с каким-нибудь текстом. Запускаю. В консоли выводится содержимое текстового файла, который лежит рядом. Далее начинаю отлаживать программу. При отладке выясняется, что самый первый цикл в программе - бесконечный. А операции вывода на консоль следуют после бесконечного цикла. Следовательно вопрос: как можно пройти через бесконечный цикл ? Пробовал также Code::Blocks (у него такой-же компилятор и дебагер), с ним те-же результаты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <fstream>
#include <list>
 
using namespace std;
 
int main()
{
    fstream f("test.txt");
    list<char> ilist; //объявляю список
    list<char>::iterator it; //и итератор
    while (! f.eof())
    {
        char c; //буфер
        f >> c ;
        ilist.push_back(c);
    }
    it = ilist.begin();
    it++;
    ilist.insert(it, '&');
    int size = ilist.size(); // число элементов
    for(int j=0; j<size; j++)
    {
        cout << ilist.front(); // читать данные из начала
        ilist.pop_front(); // извлечение данных из начала
    }
    f.close();
    char c; //чтобы окно
    cin >> c; //не закрылось
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 12:41     Как можно пройти через бесконечный цикл ??? #2
И где тут бесконечный цикл?
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 12:58  [ТС]     Как можно пройти через бесконечный цикл ??? #3
Цитата Сообщение от Evg Посмотреть сообщение
И где тут бесконечный цикл?
Цитата Сообщение от RNT Посмотреть сообщение
При отладке выясняется, что самый первый цикл в программе - бесконечный
C++
1
2
3
4
5
6
while (! f.eof())
 {
 char c; //буфер
 f >> c ;
 ilist.push_back(c);
 }
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 13:21     Как можно пройти через бесконечный цикл ??? #4
И каким образом при отладке выясняется, что цикл бесконечный? Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 13:30  [ТС]     Как можно пройти через бесконечный цикл ??? #5
Цитата Сообщение от Evg Посмотреть сообщение
И каким образом при отладке выясняется, что цикл бесконечный?
Ставлю брейкпоинт после цикла. Запускаю. До брейпоинта выполнение не доходит. CPU нагружается на 100%. Приходится убивать процесс из диспетчера задач.
Пробовал отлаживать построчно. Замучился нажимать клавишу F7....

Цитата Сообщение от Evg Посмотреть сообщение
Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
В моем файле всего 7 букв
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 14:23     Как можно пройти через бесконечный цикл ??? #6
Значит возможно глючит отладчик. Для того, чтобы убедиться, вовнутрь первого цикла воткни какую-нибудь печать и сравни поведение из-под отладчика и без него
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 15:07  [ТС]     Как можно пройти через бесконечный цикл ??? #7
Цитата Сообщение от Evg Посмотреть сообщение
Значит возможно глючит отладчик. Для того, чтобы убедиться, вовнутрь первого цикла воткни какую-нибудь печать и сравни поведение из-под отладчика и без него
Похоже так оно и есть. Сделал такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <list>
 
using namespace std;
 
int main()
{
    fstream f("test.txt");
    list<char> ilist; //объявляю список
    list<char>::iterator it; //и итератор
    int i=0;
    while (! f.eof())
    {
        char c; //буфер
        f >> c ;
        ilist.push_back(c);
        cout << i++<<'\n';
    }
    it = ilist.begin();
    it++;
    ilist.insert(it, '&');
    int size = ilist.size(); // число элементов
    for(int j=0; j<size; j++)
    {
        cout << ilist.front(); // читать данные из начала
        ilist.pop_front(); // извлечение данных из начала
    }
    f.close();
    char c; //чтобы окно
    cin >> c; //не закрылось
    return 0;
}
В файле test.txt написал anything, запустил exe`шник. В консоли вышло:

Код
0
1
2
3
4
5
6
7
8
a&nythingg
А в дебагере вышел бесконечный цикл.

Что мне делать ? Отлаживать дебагер ?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 15:19     Как можно пройти через бесконечный цикл ??? #8
Цитата Сообщение от RNT Посмотреть сообщение
Что мне делать ? Отлаживать дебагер ?
Учиться отлаживаться без дебаггера. Или установить более свежий, потому как есть подозрение, что там маненько устаревший. Для порядку ещё поставь печать того, что прочлось из файла. Особой пользы это не принесёт, но по крайней мере будет понятно, отладчик своей работой портить непосредственный чтения из файла или feof

Добавлено через 1 минуту
Ещё попробуй из цикла удалить "ilist.push_back(c);", может с этим что-то не так
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 15:42  [ТС]     Как можно пройти через бесконечный цикл ??? #9
Цитата Сообщение от Evg Посмотреть сообщение
Ещё попробуй из цикла удалить "ilist.push_back(c);", может с этим что-то не так
Не подействовало

Цитата Сообщение от Evg Посмотреть сообщение
Учиться отлаживаться без дебаггера.
Все равно что читать с закрытыми глазами.

Цитата Сообщение от Evg Посмотреть сообщение
Или установить более свежий, потому как есть подозрение, что там маненько устаревший.
GDB у меня свежайший. Вчера скачал.

Цитата Сообщение от Evg Посмотреть сообщение
Для порядку ещё поставь печать того, что прочлось из файла. Особой пользы это не принесёт, но по крайней мере будет понятно, отладчик своей работой портить непосредственный чтения из файла или feof
Сделал я так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <list>
 
 
using namespace std;
 
int main()
{
    fstream f("test.txt");
    list<char> ilist; //объявляю список
    list<char>::iterator it; //и итератор
    while (! f.eof())
    {
        char c; //буфер
        f >> c ;
        ilist.push_back(c);
        cout << c<<'\n';
    }
    it = ilist.begin();
    it++;
    ilist.insert(it, '&');
    int size = ilist.size(); // число элементов
    for(int j=0; j<size; j++)
    {
        cout << ilist.front(); // читать данные из начала
        ilist.pop_front(); // извлечение данных из начала
    }
    f.close();
    char c; //чтобы окно
    cin >> c; //не закрылось
    return 0;
}
Если запустить exe`шник из Проводника, то выводит:

Код
a
n
y
t
h
i
n
g
g
a&nythingg
Если дебажить, то опять бесконечный цикл. И выводит только знаки переноса строк, буквы не выводить вообще.

И еще одна зацепка. Если из IDE Code::Blocks запустить прогу командой Build=>Run, то будет бесконечный цикл. И выводит только знаки переноса строк, буквы не выводить вообще. Так что дело может не в GDB
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 15:57     Как можно пройти через бесконечный цикл ??? #10
Цитата Сообщение от RNT Посмотреть сообщение
Все равно что читать с закрытыми глазами.
Я 99% отладки делаю при помощи печатей без всяких отладчиков. 0.99% - запуск отладчика для того, чтобы понять, в какой точке программа фатально навернулась. Оставшиеся 0.01% - это тяжёлые случаи навроде того, когда выход за границу массива испортил данные, а проявляется это очень далеко от точки возникновения ошибки. Но такие ситуации у меня возникают всё реже и реже, т.к. их предупреждают средства статического контроля (ASSERT'ы) в критических или опасных местах кода

Цитата Сообщение от RNT Посмотреть сообщение
И еще одна зацепка. Если из IDE Code::Blocks запустить прогу командой Build=>Run, то будет бесконечный цикл. И выводит только знаки переноса строк, буквы не выводить вообще. Так что дело может не в GDB
ТОгда появни в двух словах, а как ДО этого ты запускал из отладчика? Я почему-то думал, что с отладчиком и без отладчика ты запускал один и тот же бинарник

Добавлено через 9 минут
Кстати, последний символ у тебя печатается два раза. А это означает, что ты неправильно работаешь с файлом

Экспериментальным путём получилось, что вот такой цикл правильно считывает нужное количество символов
C++
1
2
3
4
5
6
7
8
        while (1)
          {
            char c; //буфер
            f >> c ;
            if (f.eof())
              break;
            cout << c << '\n';
          }
Но у меня нет опыта работы на Си++, вариант на Си мне куда более понятен и логичен
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 16:43  [ТС]     Как можно пройти через бесконечный цикл ??? #11
Цитата Сообщение от Evg Посмотреть сообщение
ТОгда появни в двух словах, а как ДО этого ты запускал из отладчика?
Поясню варианты которые я пробовал.

1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Но выводит два раза букву g
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |

Цитата Сообщение от Evg Посмотреть сообщение
Я 99% отладки делаю при помощи печатей без всяких отладчиков.
Зачем так принципиально ? С отладчиком ведь гораздо удобнее, если он работает нормально

Цитата Сообщение от Evg Посмотреть сообщение
Экспериментальным путём получилось, что вот такой цикл правильно считывает нужное количество символов
Вот результаты:

1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Выводит один раз букву g как надо
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 17:07     Как можно пройти через бесконечный цикл ??? #12
Цитата Сообщение от RNT Посмотреть сообщение
1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Но выводит два раза букву g
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
Блин, я совсем забыл, что ты под виндами... Просто под виндами и юниксами разные принципы работы отладчика. Как вариант попробуй статическую линкову (может отладчик коряво в динамическими приложениями под виндой работает. И не причина ли в том, что отлаживаешь Relese сборку?

Цитата Сообщение от RNT Посмотреть сообщение
Зачем так принципиально ? С отладчиком ведь гораздо удобнее, если он работает нормально
На мой взгляд печатями гораздо удобнее. Та за одну секунду получаешь всю трассу работы программы, в то время как в отладчике проковыряешь полдня. Не говоря уж о том, что не зависишь от наличия отладчика. Но речь не об этом
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 17:25  [ТС]     Как можно пройти через бесконечный цикл ??? #13
Цитата Сообщение от Evg Посмотреть сообщение
И не причина ли в том, что отлаживаешь Relese сборку?
С этим все в порядке. Сборка Debug

Цитата Сообщение от Evg Посмотреть сообщение
Как вариант попробуй статическую линкову (может отладчик коряво в динамическими приложениями под виндой работает
Это как сделать ?

P.S. Я в данной проге Qt не использую
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 17:58     Как можно пройти через бесконечный цикл ??? #14
Цитата Сообщение от RNT Посмотреть сообщение
Это как сделать ?
Хз, я под виндами как-то только в Borland-студии работал. И gdb под виндами вообще никогда не запускал
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 18:29  [ТС]     Как можно пройти через бесконечный цикл ??? #15
Цитата Сообщение от RNT Посмотреть сообщение
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
Очень возможно, что дело не в дебагере т.к. при запуске из IDE прога тоже нормально работать не хочет. Отсюда вопрос: чем запуск из IDE отличается от запуска из Виндовсного Проводника ?

P.S. В Eclipse те-же самые проблемы что и в Code::Blocks
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 18:47     Как можно пройти через бесконечный цикл ??? #16
Цитата Сообщение от RNT Посмотреть сообщение
Очень возможно, что дело не в дебагере т.к. при запуске из IDE прога тоже нормально работать не хочет. Отсюда вопрос: чем запуск из IDE отличается от запуска из Виндовсного Проводника ?
Может проблема в том, что файл не открылся? Проверь "f.is_open ()"
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 19:48  [ТС]     Как можно пройти через бесконечный цикл ??? #17
Цитата Сообщение от Evg Посмотреть сообщение
Может проблема в том, что файл не открылся? Проверь "f.is_open ()"
Да ! Файл не открывается при дебаге и при запуске из IDE.

Сделал так:
Заменил:
C++
1
fstream f("test.txt");
На:
C++
1
fstream f("C:\\Documents and Settings\\RNT\\My Documents\\Parser\\Parser\\bin\\Debug\\test.txt");
И все заработало. Отсюда вывод: при дебаге и при запуске из IDE локальный путь к файлу не работает. Почему ?

Блин, зря я пренебрегал проверкой успешности открытия файла.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,354
Записей в блоге: 26
31.10.2009, 19:54     Как можно пройти через бесконечный цикл ??? #18
Цитата Сообщение от RNT Посмотреть сообщение
Отсюда вывод: при дебаге и при запуске из IDE локальный путь к файлу не работает. Почему ?
Видимо из разных каталогов запускаются. Как выяснить текущий каталог - не помню. Может в винде getcwd тоже есть
RNT
Автор FAQ
 Аватар для RNT
3131 / 351 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 20:32  [ТС]     Как можно пройти через бесконечный цикл ??? #19
Цитата Сообщение от Evg Посмотреть сообщение
Видимо из разных каталогов запускаются. Как выяснить текущий каталог - не помню. Может в винде getcwd тоже есть
Функцию, которая может узнать текущий каталог, я нашел только для С++ Билдера. Тогда поступил по другому. Вставил такою строчку в исходник:
C++
1
ofstream test("testfile");
Затем при помощи поиска нашел папку в которой создался файл:
C:\Documents and Settings\RNT\My Documents\Parser\Parser

А exe`шник лежит в папке:
C:\Documents and Settings\RNT\My Documents\Parser\Parser\bin\Debug

При дебаге и при запуске из IDE, текущей папкой считается папка, в которой лежит исходник.

Женя, спасибо тебе за помощь !
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2009, 13:43     Как можно пройти через бесконечный цикл ???
Еще ссылки по теме:

C++ Бесконечный цикл с повторением через промежуток времени
Как создать бесконечный цикл C++
Бесконечный цикл C++
C++ Как можно вывести задачу через цикл for
Можно ли сделать бесконечный цикл с while, используя тип bool? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
cristaloleg
 Аватар для cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
06.11.2009, 13:43     Как можно пройти через бесконечный цикл ??? #20
а не могла ли быть (еще) проблема в том, что ты открывал файл fstream - без указания опций???
Yandex
Объявления
06.11.2009, 13:43     Как можно пройти через бесконечный цикл ???
Ответ Создать тему
Опции темы

Текущее время: 18:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru