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

Нюансы условий достижения EOF в ifstream - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ While и for, почему так? http://www.cyberforum.ru/cpp-beginners/thread1104414.html
#include <iostream> using namespace std; #include <conio.h> int main() { for(int counter = 1;counter <=10;counter++) {
C++ Из делфи в си while (not (stringgrid2.Cells=''))or (not (i=100)) do begin v:= strtoint(stringgrid2.Cells); i:=i+1; end; Помогите переделать данный цикл в C++. http://www.cyberforum.ru/cpp-beginners/thread1104402.html
Найти ошибку C++
HugeInteger::HugeInteger() { for (int i = 0; i <sizeArray; ++i) { array = rand()%10; } } void HugeInteger::sumOfHugeInteger(HugeInteger hugeTwo) { int sumOfInteger = {0}; int sizeSumArray = 0; for (int i = sizeArray - 1; i >= 0; --i) {
Найти ошибку C++
Нужно, чтобы при вводе номера месяца выбивалось его название и кол-во дней. Но в 13й строке ошибка: #include <iostream> #include<conio.h> using namespace std; int main() { int a; cout << "Vvedite a" "\n"; // à - ìåñÿö êîòîðûé íàì íóæåí cin >> a;
C++ Убрать в переменной типа string пробелы http://www.cyberforum.ru/cpp-beginners/thread1104366.html
Задача у меня такая. Пользователь вводит текст с консоли. 1.Удалить все пробелы и знаки препинания. 2. Очередную букву в цикле поменять на следующую букву. То есть к примеру я ввожу текст: Abc, abc Должно получатся Bcdbcd
C++ Правильно решил пример? using namespace std; int main() { std::cout << "Enter x "; int x; std::cin >> x; std::cout << "\nEnter a "; int a; std::cin >> a; подробнее

Показать сообщение отдельно
SaShka K
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 55
25.02.2014, 16:29  [ТС]     Нюансы условий достижения EOF в ifstream
осталось без ответа 2 второстепенных, но всё же интересных мне вопроса, чёткого ответа на которые я найти в сети не могу:
Рассматриваю их на примере поведения этого же кода, т.к. вскрытая благодаря retmas ошибка проектирования не мешает говорить о них:

1) Почему при установке флага `failbit` входного файлового потока проверка на `get()==EOF` даёт `true`, хотя фактически конец файла не был достигнут?
Это просто побочный эффект этого флага, или причина глубже?

2) (писал об этом в примечании № 5. в изначальной постановке. Тут излагаю лаконичнее): Если в написанном в постановке вопроса коде в цикле добавляю выражение с функцией `clear()`, снимающей флаги ошибок потока, то проверка функции eof() всё равно не срабатывает и цикл остаётся вечным:
C++
1
2
3
4
5
6
   ...
   while (!fileIn.eof()) {
      fileIn >> ch; // (см. 5.)
      std::cout << ch << ", ";
      fileIn.clear();
   }
На выводе получаю бесконечно выводимую пятёрку (последний символ в файле). Хотя ожидал, что прочтётся '5', тут возможно установится флаг eofbit, но тут же clear() его снимет и в следующей итерации уже произойдёт попытка чтения за границей файла, что при следующей проверке условия цикла вызовет срабатывание `eof()`. Но получается не так.

Я правильно предполагаю причину этого: получается ситуация, что происходит всё как я описал, НО после чтения '5' включается флаг `eofbit`, но курсор не двигается и так и остаётся на последнем символе файла (т.к. программа поняла, что достигнут конец файла, курсор не двигает дальше). Соответственно, когда снимаю флаг, возвращаюсь в точно ту же ситуацию, которая была в начале предыдущей итерации.
Так? Или я что-то неверно истолковываю?
 
Текущее время: 11:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru