0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 5

fstream и for

15.05.2013, 23:42. Показов 1917. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2013, 23:42
Ответы с готовыми решениями:

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

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

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

24
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
15.05.2013, 23:49
а чем так не устраивает?
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
15.05.2013, 23:51

Не по теме:

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

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

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

Добавлено через 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2013, 00:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Оптимизация производительности Express.js бэкенда
Reangularity 23.05.2025
Express. js заслуженно остаётся одним из самых популярных инструментов для создания бэкенда, но даже он не застрахован от проблем с производительностью. Многие разработчики сталкиваются с ситуацией,. . .
Продвинутая обработка данных с LINQ в C#
stackOverflow 23.05.2025
LINQ (Language Integrated Query) — это фундаментальное изменение парадигмы работы с данными в C#. Простые запросы Where и Select знакомы любому разработчику, но настоящая мощь LINQ раскрывается в. . .
Инфраструктура PKI и сертификатов безопасности
Mr. Docker 23.05.2025
PKI (Public Key Infrastructure) — это невидимый фундамент цифрового доверия, без которого современный интернет просто рассыпался бы как карточный домик. За этой аббревиатурой скрывается целый. . .
Аутентификация OAuth в Python
py-thonny 22.05.2025
OAuth (Open Authorization) — это целый стандарт для делегированного доступа. Звучит занудно? Давайте проще: OAuth позволяет приложениям получать доступ к информации пользователя на сторонних сервисах. . .
Хеширование и соль паролей в веб-приложениях C#
stackOverflow 22.05.2025
Когда-то в начале своей карьеры я тоже грешил простейшими подходами к хранению паролей – MD5-хеширование казалось верхом защиты. Но технологии не стоят на месте, вычислительные мощьности растут, и. . .
Генераторы Python для эффективной обработки данных
AI_Generated 21.05.2025
В Python существует инструмент настолько мощный и в то же время недооценённый, что я часто сравниваю его с тайным оружием в арсенале программиста. Речь идёт о генераторах — одной из самых элегантных. . .
Чем заменить Swagger в .NET WebAPI
stackOverflow 21.05.2025
Если вы создавали Web API на . NET в последние несколько лет, то наверняка сталкивались с зелёным интерфейсом Swagger UI. Этот инструмент стал практически стандартом для документирования и. . .
Использование Linq2Db в проектах C# .NET
UnmanagedCoder 21.05.2025
Среди множества претендентов на корону "идеального ORM" особое место занимает Linq2Db — микро-ORM, балансирующий между мощью полноценных инструментов и легковесностью ручного написания SQL. Что. . .
Реализация Domain-Driven Design с Java
Javaican 20.05.2025
DDD — это настоящий спасательный круг для проектов со сложной бизнес-логикой. Подход, предложенный Эриком Эвансом, позволяет создавать элегантные решения, которые точно отражают реальную предметную. . .
Возможности и нововведения C# 14
stackOverflow 20.05.2025
Выход версии C# 14, который ожидается вместе с . NET 10, приносит ряд интересных нововведений, действительно упрощающих жизнь разработчиков. Вы уже хотите опробовать эти новшества? Не проблема! Просто. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru