Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
1

fstream и for

15.05.2013, 23:42. Просмотров 978. Ответов 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 23:42
Ответы с готовыми решениями:

Fstream
Можете пояснить что такое объект fstream

fstream с++
Помогите пожалуйста... Как при считывании из файла считать переменные если они...

fstream
Всем доброго дня! Как с помощью библиотеки fstream вывести содержимое файла на...

fstream
помогите, пожалуйста, чет я совсем запуталась((( /*Дан текстовый фал,...

fstream
Дан текстовый файл. Осуществить посимвольную чередующуюся печать файла в прямом...

24
Olivеr
413 / 409 / 95
Регистрация: 06.10.2011
Сообщений: 832
15.05.2013, 23:49 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;
}
0
metaluga145
15.05.2013, 23:51
  #3

Не по теме:

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

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

Добавлено через 5 минут
markusblackmann, странно,но у меня работает!могу показать скрин.
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
16.05.2013, 00:01 6
Цитата Сообщение от metaluga145 Посмотреть сообщение
stima, но там с точно инициализирована.
Согласен^^. Когда вы тестируете 2 вариант там нету '@'
0
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:03  [ТС] 7
Цитата Сообщение от stima Посмотреть сообщение
И тот и тот код приводит к зацикливанию. Потому что в файле может не быть '@'.
и первый пример кода, и второй пример кода запускался в одном и том же проекте, где был файл "somefile.txt", и во втором примере все отлично работало. следовательно, в файле есть символ '@'. И значение не берется из "мусора" только потому, что в первом примере переменная определена, если Вы посмотрите внимательней, а во втором нет смысла его определять.
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
16.05.2013, 00:06 8
Тогда файл в студию. Магии нету. Есть просто закулисье. Или Вы привили не весь код, и та часто кода играете роль или в файле при тесте нету @.
0
metaluga145
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
16.05.2013, 00:06 9
В общем, код рабочий. Попробуйте подебажить построчно, посмотреть что да как
0
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:14  [ТС] 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 минуты
вообщем, подвох таится в злых гремлинах, не иначе.
0
DU
1487 / 1133 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:15 11
код работающий. бесконечного цикла нет.
есть вариант что файл не найден и file.good() == false с самого начала.
перед циклом проверку сделайте, файл точно открывается и в нем точно есть нужный символ?
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
16.05.2013, 00:15 12
Еще раз. И тот и тот вариант уйдут на бесконечность если в файле НЕТУ '@'. А так варианты идентичны.
0
markusblackmann
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:16  [ТС] 13
Цитата Сообщение от DU Посмотреть сообщение
код работающий. бесконечного цикла нет.
есть вариант что файл не найден и file.good() == false с самого начала.
перед циклом проверку сделайте, файл точно открывается и в нем точно есть нужный символ?
тогда бы не работал второй вариант, я думаю.
0
DU
1487 / 1133 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:26 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();
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
16.05.2013, 00:30 15
2DU, деббагер прав. При итерации по циклу вы заместили переменную.
0
grizlik78
Эксперт С++
2005 / 1489 / 203
Регистрация: 29.05.2011
Сообщений: 3,084
16.05.2013, 00:31 16
Цитата Сообщение от DU Посмотреть сообщение
// если тут навести мышкой на c, то показывается '@', хотя должно быть '!'
Не, в этом месте должен быть '!'. На время действия цикла создаётся новая локальная переменная с тем же именем, а по окончании цикла она уничтожается, а внешняя переменная осталась нетронутой, всё верно. Вот если бы из заголовка цикла убрать слово char...
0
DU
1487 / 1133 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:32 17
он не прав. в конце цикла стоит ;
значит в точке, где я смотрю переменную та, которая была в цикле уже умерла. выводится при этом '!'
0
grizlik78
Эксперт С++
2005 / 1489 / 203
Регистрация: 29.05.2011
Сообщений: 3,084
16.05.2013, 00:34 18
А, мы оба комментарий наоборот прочитали
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
16.05.2013, 00:34 19
нет он прав. В тот момент когда вы смотрите значение с, вы итерируетесь по циклу.
0
DU
1487 / 1133 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:42 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 студии та же фигня
0
16.05.2013, 00:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 00:42

<fstream>
как читать из файла и записывать переменные написанные через пробел используя...

Fstream и malloc_assert
Подскажите пожалуйста, а то уже голова болит. Есть программа которая...

Ошибка с fstream
При создании исполняемого файла (т.е release версии) вылезает ошибка: raised...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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