Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
1

fstream и for

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2013, 23:42
Ответы с готовыми решениями:

C++ fstream
входной файл: 2 20 30 27 2 - это размер массива(размер будет + 1) вторая строчка это числа в...

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

fstream
Уважаемые Форумчани, не могу понять по чему не хочет открываться файл второй раз: ifstream in;...

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

24
415 / 411 / 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
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.05.2013, 23:52 4
И тот и тот код приводит к зацикливанию. Потому что в файле может не быть '@'.
2-й Вариант может иногда (смотря как звезды встанут) работать если переменная char c не будет проинициализирована ее значение возьмется из мусора и может совпасть с '@'.
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
15.05.2013, 23:59 5
stima, но там с точно инициализирована.

Добавлено через 5 минут
markusblackmann, странно,но у меня работает!могу показать скрин.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 00:01 6
Цитата Сообщение от metaluga145 Посмотреть сообщение
stima, но там с точно инициализирована.
Согласен^^. Когда вы тестируете 2 вариант там нету '@'
0
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:03  [ТС] 7
Цитата Сообщение от stima Посмотреть сообщение
И тот и тот код приводит к зацикливанию. Потому что в файле может не быть '@'.
и первый пример кода, и второй пример кода запускался в одном и том же проекте, где был файл "somefile.txt", и во втором примере все отлично работало. следовательно, в файле есть символ '@'. И значение не берется из "мусора" только потому, что в первом примере переменная определена, если Вы посмотрите внимательней, а во втором нет смысла его определять.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 00:06 8
Тогда файл в студию. Магии нету. Есть просто закулисье. Или Вы привили не весь код, и та часто кода играете роль или в файле при тесте нету @.
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
16.05.2013, 00:06 9
В общем, код рабочий. Попробуйте подебажить построчно, посмотреть что да как
0
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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:15 11
код работающий. бесконечного цикла нет.
есть вариант что файл не найден и file.good() == false с самого начала.
перед циклом проверку сделайте, файл точно открывается и в нем точно есть нужный символ?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 00:15 12
Еще раз. И тот и тот вариант уйдут на бесконечность если в файле НЕТУ '@'. А так варианты идентичны.
0
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5
16.05.2013, 00:16  [ТС] 13
Цитата Сообщение от DU Посмотреть сообщение
код работающий. бесконечного цикла нет.
есть вариант что файл не найден и file.good() == false с самого начала.
перед циклом проверку сделайте, файл точно открывается и в нем точно есть нужный символ?
тогда бы не работал второй вариант, я думаю.
0
DU
1500 / 1146 / 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
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 00:30 15
2DU, деббагер прав. При итерации по циклу вы заместили переменную.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
16.05.2013, 00:31 16
Цитата Сообщение от DU Посмотреть сообщение
// если тут навести мышкой на c, то показывается '@', хотя должно быть '!'
Не, в этом месте должен быть '!'. На время действия цикла создаётся новая локальная переменная с тем же именем, а по окончании цикла она уничтожается, а внешняя переменная осталась нетронутой, всё верно. Вот если бы из заголовка цикла убрать слово char...
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.05.2013, 00:32 17
он не прав. в конце цикла стоит ;
значит в точке, где я смотрю переменную та, которая была в цикле уже умерла. выводится при этом '!'
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
16.05.2013, 00:34 18
А, мы оба комментарий наоборот прочитали
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 00:34 19
нет он прав. В тот момент когда вы смотрите значение с, вы итерируетесь по циклу.
0
DU
1500 / 1146 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2013, 00:42
Помогаю со студенческими работами здесь

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

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

Fstream
multiple definition of `ZapisInputFile'| Определив ofstream в header файле получаю ошибку, а...

fstream
в каком пакете находится заголовок fstream ? у меня стоит g++-4.4 Добавлено через 4 минуты и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru