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

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

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

fstream и for - C++

15.05.2013, 23:42. Просмотров 836. Ответов 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++
Здравствуйте, Уважаемые форумчане ! Есть код: //Дан файл, содержащий несколько строк. Найти максимальную длину строки и вывести в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
15.05.2013, 23:49     fstream и for #2
а чем так не устраивает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    fstream file("text.txt", ios::in);
    char c;
    while (file.good()) {
        c = file.get();
        cout << c;
    }
    file.close();
    return 0;
}
metaluga145
15.05.2013, 23:51
  #3

Не по теме:

Olivеr, вопрос не в том как сделать,а почему именно так,как написано, не работает

stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
15.05.2013, 23:52     fstream и for #4
И тот и тот код приводит к зацикливанию. Потому что в файле может не быть '@'.
2-й Вариант может иногда (смотря как звезды встанут) работать если переменная char c не будет проинициализирована ее значение возьмется из мусора и может совпасть с '@'.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
15.05.2013, 23:59     fstream и for #5
stima, но там с точно инициализирована.

Добавлено через 5 минут
markusblackmann, странно,но у меня работает!могу показать скрин.
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
16.05.2013, 00:01     fstream и for #6
Цитата Сообщение от metaluga145 Посмотреть сообщение
stima, но там с точно инициализирована.
Согласен^^. Когда вы тестируете 2 вариант там нету '@'
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:03  [ТС]     fstream и for #7
Цитата Сообщение от stima Посмотреть сообщение
И тот и тот код приводит к зацикливанию. Потому что в файле может не быть '@'.
и первый пример кода, и второй пример кода запускался в одном и том же проекте, где был файл "somefile.txt", и во втором примере все отлично работало. следовательно, в файле есть символ '@'. И значение не берется из "мусора" только потому, что в первом примере переменная определена, если Вы посмотрите внимательней, а во втором нет смысла его определять.
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
16.05.2013, 00:06     fstream и for #8
Тогда файл в студию. Магии нету. Есть просто закулисье. Или Вы привили не весь код, и та часто кода играете роль или в файле при тесте нету @.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
16.05.2013, 00:06     fstream и for #9
В общем, код рабочий. Попробуйте подебажить построчно, посмотреть что да как
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:14  [ТС]     fstream и for #10
Цитата Сообщение от metaluga145 Посмотреть сообщение
markusblackmann, странно,но у меня работает!могу показать скрин.
может это происки компилятора? Оо какой у Вас?

Добавлено через 3 минуты
Цитата Сообщение от stima Посмотреть сообщение
Тогда файл в студию. Магии нету. Есть просто закулисье. Или Вы привили не весь код, и та часто кода играете роль или в файле при тесте нету @.
файл в студию? та пожалуйста, любой текстовый файл, где присутствует хоть один символ @ сойдет =)
и весь код могу привести:
C++
1
2
3
4
5
6
7
8
#include <fstream>
 
void main()
{
  std::ifstream file("somefile.txt");
  for(char c=0; c!='@'; file >> c);
  file.close();
}
Добавлено через 4 минуты
вообщем, подвох таится в злых гремлинах, не иначе.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:15     fstream и for #11
код работающий. бесконечного цикла нет.
есть вариант что файл не найден и file.good() == false с самого начала.
перед циклом проверку сделайте, файл точно открывается и в нем точно есть нужный символ?
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
16.05.2013, 00:15     fstream и for #12
Еще раз. И тот и тот вариант уйдут на бесконечность если в файле НЕТУ '@'. А так варианты идентичны.
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:16  [ТС]     fstream и for #13
Цитата Сообщение от DU Посмотреть сообщение
код работающий. бесконечного цикла нет.
есть вариант что файл не найден и file.good() == false с самого начала.
перед циклом проверку сделайте, файл точно открывается и в нем точно есть нужный символ?
тогда бы не работал второй вариант, я думаю.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:26     fstream и for #14
ну если они в одном и том же проекте - то пожалуй да. это все странно.
выводите на печать тогда, чтобы хоть что-то было видно что там читается.
у меня работает как надо, но вот глючок в дебагере студийном обнаружился:
C++
1
2
3
4
5
  char c = '!';
  std::ifstream file("x.txt");
  for(char c = 0; c != '@'; file >> c);
  std::cout << c << std::endl; // если тут навести мышкой на c, то показывается '@', хотя должно быть '!'
  file.close();
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
16.05.2013, 00:30     fstream и for #15
2DU, деббагер прав. При итерации по циклу вы заместили переменную.
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
16.05.2013, 00:31     fstream и for #16
Цитата Сообщение от DU Посмотреть сообщение
// если тут навести мышкой на c, то показывается '@', хотя должно быть '!'
Не, в этом месте должен быть '!'. На время действия цикла создаётся новая локальная переменная с тем же именем, а по окончании цикла она уничтожается, а внешняя переменная осталась нетронутой, всё верно. Вот если бы из заголовка цикла убрать слово char...
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:32     fstream и for #17
он не прав. в конце цикла стоит ;
значит в точке, где я смотрю переменную та, которая была в цикле уже умерла. выводится при этом '!'
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
16.05.2013, 00:34     fstream и for #18
А, мы оба комментарий наоборот прочитали
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
16.05.2013, 00:34     fstream и for #19
нет он прав. В тот момент когда вы смотрите значение с, вы итерируетесь по циклу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 00:42     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...


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

Или воспользуйтесь поиском по форуму:
DU
1480 / 1056 / 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 студии та же фигня
Yandex
Объявления
16.05.2013, 00:42     fstream и for
Ответ Создать тему
Опции темы

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