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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
RNT
Автор FAQ
3133 / 353 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
#1

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

31.10.2009, 12:30. Просмотров 2593. Ответов 20
Метки нет (Все метки)

У меня случилось что-то вроде парадокса. Прогал я в 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2009, 12:30     Как можно пройти через бесконечный цикл ???
Посмотрите здесь:

Можно ли сделать бесконечный цикл с while, используя тип bool? - C++
... bool f; f=false; while(f=false) { ... ... ... if(....)//какое-то условие f=true;//цикл прерывается

Бесконечный цикл с повторением через промежуток времени - C++
как создать бесконечный цикл с повторением через промежуток времени? вот цикл, который надо повторять: #include&lt;iostream&gt; ...

Как можно вывести задачу через цикл for - C++
Как вывести задачу через цикл for: S= 0.18x + (0.20x)^2 + (0.22x)^3 +...+ (0.36x)^10; (x=1, s=0.236)

как создать бесконечный цикл - C++
помогите)нужно чтоб можно было вводить несколько раз за сеанс)экзе файл закрывается

Бесконечный цикл (как избежать?) - C++
Программа должна принимать только одно из трёх значений переменной 'destiny'. Если вводят любое другое значение, программа должна повторять...

Как создать бесконечный цикл - C++
Не могу создать бесконечный цикл, для проверки символов вводимых пользователем. Нужно чтобы при вводе букв выдавалось ошибка, что можно...

как засунуть условно-бесконечный цикл - C++
еще позавчера как-то умудрился, но задача решена была неверно, сейчас уже мозг потек... #include &lt;iostream&gt; #include &lt;cmath&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 12:41     Как можно пройти через бесконечный цикл ??? #2
И где тут бесконечный цикл?
RNT
Автор FAQ
3133 / 353 / 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
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 13:21     Как можно пройти через бесконечный цикл ??? #4
И каким образом при отладке выясняется, что цикл бесконечный? Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
RNT
Автор FAQ
3133 / 353 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
31.10.2009, 13:30  [ТС]     Как можно пройти через бесконечный цикл ??? #5
Цитата Сообщение от Evg Посмотреть сообщение
И каким образом при отладке выясняется, что цикл бесконечный?
Ставлю брейкпоинт после цикла. Запускаю. До брейпоинта выполнение не доходит. CPU нагружается на 100%. Приходится убивать процесс из диспетчера задач.
Пробовал отлаживать построчно. Замучился нажимать клавишу F7....

Цитата Сообщение от Evg Посмотреть сообщение
Выход из цикла произойдёт тогда, когда из файла будет прочитано всё
В моем файле всего 7 букв
Evg
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 14:23     Как можно пройти через бесконечный цикл ??? #6
Значит возможно глючит отладчик. Для того, чтобы убедиться, вовнутрь первого цикла воткни какую-нибудь печать и сравни поведение из-под отладчика и без него
RNT
Автор FAQ
3133 / 353 / 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
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 15:19     Как можно пройти через бесконечный цикл ??? #8
Цитата Сообщение от RNT Посмотреть сообщение
Что мне делать ? Отлаживать дебагер ?
Учиться отлаживаться без дебаггера. Или установить более свежий, потому как есть подозрение, что там маненько устаревший. Для порядку ещё поставь печать того, что прочлось из файла. Особой пользы это не принесёт, но по крайней мере будет понятно, отладчик своей работой портить непосредственный чтения из файла или feof

Добавлено через 1 минуту
Ещё попробуй из цикла удалить "ilist.push_back(c);", может с этим что-то не так
RNT
Автор FAQ
3133 / 353 / 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
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 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
3133 / 353 / 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
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 17:07     Как можно пройти через бесконечный цикл ??? #12
Цитата Сообщение от RNT Посмотреть сообщение
1) Запускать exe`шник из Виндового Проводника. Двойным щелчком по exe`шнику. Работает нормально. Тоесть не зацикливается. Но выводит два раза букву g
2) Запускать из IDE. Щелчком по меню Build=>Run. Работает НЕ нормально. Зацикливается. Выводит только знаки переноса строки \n
3) Дебажить, тоесть выполнять построчно. Работает НЕ нормально. Зацикливается. Выводит бесконечно столбиком знак |
Блин, я совсем забыл, что ты под виндами... Просто под виндами и юниксами разные принципы работы отладчика. Как вариант попробуй статическую линкову (может отладчик коряво в динамическими приложениями под виндой работает. И не причина ли в том, что отлаживаешь Relese сборку?

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

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

P.S. Я в данной проге Qt не использую
Evg
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 17:58     Как можно пройти через бесконечный цикл ??? #14
Цитата Сообщение от RNT Посмотреть сообщение
Это как сделать ?
Хз, я под виндами как-то только в Borland-студии работал. И gdb под виндами вообще никогда не запускал
RNT
Автор FAQ
3133 / 353 / 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
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 18:47     Как можно пройти через бесконечный цикл ??? #16
Цитата Сообщение от RNT Посмотреть сообщение
Очень возможно, что дело не в дебагере т.к. при запуске из IDE прога тоже нормально работать не хочет. Отсюда вопрос: чем запуск из IDE отличается от запуска из Виндовсного Проводника ?
Может проблема в том, что файл не открылся? Проверь "f.is_open ()"
RNT
Автор FAQ
3133 / 353 / 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
Эксперт CАвтор FAQ
17471 / 5709 / 363
Регистрация: 30.03.2009
Сообщений: 15,679
Записей в блоге: 26
31.10.2009, 19:54     Как можно пройти через бесконечный цикл ??? #18
Цитата Сообщение от RNT Посмотреть сообщение
Отсюда вывод: при дебаге и при запуске из IDE локальный путь к файлу не работает. Почему ?
Видимо из разных каталогов запускаются. Как выяснить текущий каталог - не помню. Может в винде getcwd тоже есть
RNT
Автор FAQ
3133 / 353 / 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++
НАписал себе напоминалку, а она жрёт процессор (~~ 45%); код упростил для понятности #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include...

Бесконечный цикл - C++
Почему компилятор выдает всякую ерунду при попытке воспроизвести этот код? Что его зацикливает? #include &quot;stdafx.h&quot; #include...

бесконечный цикл - C++
Когда пытаюсь считать строки из файла с помощью цикла, он почему то начинает повторятся бесконечно. Вот код: int main(int argc, char*...

Бесконечный цикл While - C++
Здравствуйте, помогите пожалуйста с задачей. Условие - ввести массив, состоящий из х числа элементов, затем &quot;распаковать&quot; его в серию нулей...

Бесконечный цикл - C++
#include &lt;iostream&gt; using namespace std; int main() { int i=0; double ea; while(i!=-1) { ...


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

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

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