Форум программистов, компьютерный форум 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
24.02.2014, 18:33     Нюансы условий достижения EOF в ifstream
Есть файл in.txt из 2х строк следующего содержания:
abcde
12345


Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <fstream>
int main() {
   std::ifstream fileIn("in.txt", std::ios::in);
 
   char* chPtr = new(char[10]);
   char ch;
   
   printf("fileIn.get() == EOF?: %d \n", (fileIn.get() == EOF));    // вывод 0
   std::cout << "fileIn.eof() = " << fileIn.eof() <<  "\n"; // вывод 0 
 
   fileIn.getline(chPtr, 3);
   std::cout << "chPtr-" << chPtr << "\n";  // вывод "bc"  (см.прим.1.)
   fileIn.get(ch);
   std::cout << "ch-" << ch << "\n";   // (см.прим.2.)
 
   printf("fileIn.get() == EOF?: %d \n", (fileIn.get() == EOF));    // вывод 1  (см.прим.3) 
   std::cout << "fileIn.eof() = " << fileIn.eof() << "\n";  // вывод 0  (см.прим.4)
   while (!fileIn.eof()) {
      fileIn >> ch; // (см. 5.)
      std::cout << ch << ", ";
   }
   fileIn.close();
   delete[] chPtr;  
}
Примечания:
(1.) 1й символ 'a' съел get() чуть выше; считалось 2 следующих символа из потока, а 3й считываемый, так понимаю, getline() автоматом пишет '\0'.

(2.) И тут собственно вопрос - выводит символ (2 вертикальные белые черты, правая из которых с промежутком посередине; расстояние между чертами == толщине каждой из них и == высоте промежутка в правой) этот символ выводится всегда, когда, например, пытаюсь прочесть в char неинициализированный участок строки.
Но в файле ведь ещё осталась часть первой строки и полностью вторая... Не понятно.

(3.) Оказыавется, мы вдруг оказались в конце файла. НО почему??

(4.) Тут продолжает быть 0, т.к. (насколько понимаю) попытки чтения за пределами конца файла ещё не было. Мы просто оказались прямо перед чертой конца файла (т.е. после последнего символа файла, но пока не заступив за его границу).

(5.) Этот цикл в текущей ситуации оказывается вечным. И проблема не в нём, т.к., переставив его в начало описанного кода, получаю нормально (ожидаемо) отрабатывающий цикл. Судя по его поведению тут, предполагаю, что каким-то образом, указатель в файле перепрыгнул в конец файла и теперь ни чтение не производится, т.к., видимо (это моё предположение) срабатывает какое-то ограничение, что одиночный char не может быть считан, если курсор стоит перед чертой конца файла, и поэтому (т.к. чтение не происходит) и курсор не перемещается далее, т.е. eof() не наступает.
Это мой второй вопрос - мне не понятно поведение.
Я прочёл, что по достижении конца файла устанавливается флаг и больше ничего прочесть из потока невозможно. Но, если добавить внуть цикла команду
C++
1
fileIn.clear();
, которая должна снимать этот флаг и делать возможным дальнейшее чтение, то выводимое значение ch просто меняется с символа с кодом (-52) на последний символ файла '5'. Из этого предполагаю, что по достижении EOF, выставляется флаг достижения конца файла, но курсор остаётся в положении на последнем символе файла (т.е. в том же положении, в которое перешёл после чтения предпоследнего символа). Правильно ли я полагаю?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru