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

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

Войти
Регистрация
Восстановить пароль
 
 
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
#1

fstream и for - C++

15.05.2013, 23:42. Просмотров 871. Ответов 24
Метки нет (Все метки)

Здрасте.
Собственно, не могу понять, по какой причине не работает вот такой вот код, хотя по идее должен работать, или я ошибаюсь?

C++
1
2
3
4
...
std::ifstream file("somefile.txt");
for(char c=0; c!='@'; file >> c);
...
по идее я рассчитываю, что перебор символов в for из файла file окончится после того, как он наткнется на символ '@', но он продолжается бесконечно, что слегка удручает, хотя вот такой код вполне себе работает:

C++
1
2
3
4
5
6
7
8
9
10
...
std::ifstream file("somefile.txt");
while(true) 
{
    char c;
    file >> c;
    if(c == '@')
        break;
}
...
прошу подсказать, что здесь за нафиг происходит, спасибо.
работаю в visual studio 2010
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 23:42     fstream и for
Посмотрите здесь:

из cstdio в fstream - C++
вод программа, написанная через функцию cstdio #include "stdafx.h" #include <cstdio> #include <iostream> #pragma warning(disable:...

Работа с fstream - C++
Здорова! Создал класс для записи и чтения файла через операцию , но почему то он работает не так как нужно. #include <iostream> ...

не работает fstream.h - C++
Всем доброго дня !!! Решил поработать с файлами. В учебнике четко сказанно , что fstream.h не требует iostream.h В...

cstdio vs fstream - C++
Есть программа, виводящяя 16-ричный дамп бинарного файла (вместо каждого байта входного файла виводится значение в 16-ричной системе) Для...

Ошибка с fstream - C++
При создании исполняемого файла (т.е release версии) вылезает ошибка: raised exception class EAccessViolation with message 'Access...

Класс fstream - C++
Здравствуйте, Уважаемые форумчане ! Есть код: //Дан файл, содержащий несколько строк. Найти максимальную длину строки и вывести в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
16.05.2013, 00:31     fstream и for #16
Цитата Сообщение от DU Посмотреть сообщение
// если тут навести мышкой на c, то показывается '@', хотя должно быть '!'
Не, в этом месте должен быть '!'. На время действия цикла создаётся новая локальная переменная с тем же именем, а по окончании цикла она уничтожается, а внешняя переменная осталась нетронутой, всё верно. Вот если бы из заголовка цикла убрать слово char...
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:32     fstream и for #17
он не прав. в конце цикла стоит ;
значит в точке, где я смотрю переменную та, которая была в цикле уже умерла. выводится при этом '!'
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
16.05.2013, 00:34     fstream и for #18
А, мы оба комментарий наоборот прочитали
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 995
Завершенные тесты: 2
16.05.2013, 00:34     fstream и for #19
нет он прав. В тот момент когда вы смотрите значение с, вы итерируетесь по циклу.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:42     fstream и for #20
откуда вы знаете, когда я смотрю? у меня бряк стоит в точке вывода. а там переменная из цикла уже мертва.
и даже если бы она была живой - это все равно глюк, т.к. правильный дебагер должен понять что та с, на которую я смотрю - это не переменная из цикла.

Добавлено через 5 минут
вот маленький апдейт
C++
1
2
3
4
5
6
7
8
  char c = 'x';
  std::ifstream file("x.txt");
  for(char c = 0; c != '@'; file >> c)
  {
  }
  char i = c;
  std::cout << c << std::endl;
  file.close();
ставим бряк на строку std::cout << c << std::endl;
смотрим дебагом чему равно i и чему с

в 12 студии та же фигня
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 995
Завершенные тесты: 2
16.05.2013, 00:46     fstream и for #21
Цитата Сообщение от DU Посмотреть сообщение
у меня бряк стоит в точке вывода. а там переменная из цикла уже мертва.
C++
1
2
3
4
          1.  for(char c...);
Бряк    2. // Переменная цикла будет видна. count - 1 раз итераций.
*************
          n. //Переменная цикла будет видна. count - 1 раз итераций.
Цитата Сообщение от DU Посмотреть сообщение
т.к. правильный дебагер должен понять что та с, на которую я смотрю - это не переменная из цикла.
Дебагер вам ничем не поможет. Так определил компилятор. А компилятору все равно видите ли вы ее или нет.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:48     fstream и for #22
ну ну. посмотрите предыдущее сообщение.
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 995
Завершенные тесты: 2
16.05.2013, 01:01     fstream и for #23
Дизассемблируйте посмотрите где что храниться и куда что мувается.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    char c = 'x';
00D71C7D  mov         byte ptr [ebp-11h],78h  //ТУТ пишется сразу в память
 
00D71C92  call        std::basic_ifstream<char,std::char_traits<char> >::basic_ifstream<char,std::char_traits<char> > (0D714B5h)  
00D71C97  mov         dword ptr [ebp-4],0  
  for(char c = 0; c != '@'; file >> c)
00D71C9E  mov         byte ptr [c],0  //ТУТ идет определение памяти по названию переменной
00D71CA5  jmp         main+7Dh (0D71CBDh)  
00D71CA7  lea         eax,[c]  
00D71CAD  push        eax  
00D71CAE  lea         ecx,[ebp-0CCh]  
00D71CB4  push        ecx  
00D71CB5  call        std::operator>><char,std::char_traits<char> > (0D7111Dh)  
00D71CBA  add         esp,8  
00D71CBD  movsx       eax,byte ptr [c]  
00D71CC4  cmp         eax,40h  
00D71CC7  je          main+8Bh (0D71CCBh)  
  {
  }
00D71CC9  jmp         main+67h (0D71CA7h)  
  char i = c;
00D71CCB  mov         al,byte ptr [ebp-11h]   //ТУТ пишется сразу из памяти
 
}
Как дебагеру понять что там? Если компилятор сказал лесом?
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 10:31     fstream и for #24
я не силен а асме и не силен в том, как устроен дебагер.
зато я знаю как должно работать: если я смотрю на глобальную относительно цикла переменную,
то и видеть должен значение этой глобальной переменной. то, что там как-то не так код сгенерился,
иди дебагер где-то не так отработал - в этом и заключается глюк. если дело в генерации кода, то в
дебаге код можно сгенерить так, чтобы этого не было, но этого не происходит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2013, 22:26     fstream и for
Еще ссылки по теме:

Класс fstream - C++
Дан файл, содержащий несколько строк. В новый файл переписать строки данного, вставляя символ ‘!’ после каждой строки, содержащей не более...

траблы с fstream - C++
Всем привет! Начинаю работать над дз по проге и никак не могу разобраться с одной фишкой с fstream. Вот мои код: #include &quot;stdafx.h&quot; ...

перегрузка fstream - C++
Вот пробую перегрузить операторы ввода / вывода с файлами, но почему-то даже не компилирует. Почему? stack.h //STACK.h #ifndef...

Работа с fstream - C++
Допустим у нас есть такие данные в файле: 100 - long: ilafj iwnvwj bve bvjere*/g*-er/hg h rh gnedrfgve и имеем простой класс class A...


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

Или воспользуйтесь поиском по форуму:
Tulosba
17.05.2013, 22:26     fstream и for
  #25

Не по теме:

Цитата Сообщение от DU Посмотреть сообщение
в 12 студии та же фигня
При этом во вкладке "Locals" выводит две разных "c", одну со значением "@", другую со значением "!". А когда входишь в режим редактирования значения, то "!" превращается в "@". Глюк студии, однозначно.

Yandex
Объявления
17.05.2013, 22:26     fstream и for
Ответ Создать тему
Опции темы

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