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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.95
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
#1

как поставить EOF? - C++

31.01.2012, 16:12. Просмотров 2762. Ответов 5
Метки нет (Все метки)

Ребят, подскажите пожалуйста. Итак, вот листинг программы. Если я открываю файл, созданный с помощью потока, все читается без проблем(я так понимаю, символ EOF ставится автоматически).
Если же я открываю файл, созданный вот так: создать-тесктовый файл и ввожу в него текст, то потом при попытке чтения из него получается бесконечный цикл(видимо, нельзя найти конец файла). Посоветуйте, пожалуйста, что можно сделать в данной ситуации... Читал про символ EOF, но, честно говоря, так и не понял как можно его поставить.

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
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<windows.h>
#include<fstream>
using namespace std;
//////////////////////////////////////////
char* Rus(const char* text);    //перевод
//////////////////////////////////////////
 
int main()
{
    char namefile[90];
    cin.getline(namefile,89);
    char buffer[81];            //содержит
                                //текст
    ifstream in(namefile);
 
    if(in.is_open())
        cout<<Rus("Файл успешно открыт\n");
 
    while(!in.eof())            //пока не
    {                           //достигнут конец
        in.getline(buffer,80);
        cout<<Rus(buffer)<<endl;
    }
 
return 0;
}
 
//////////////////////////////////
char bufRus[256];
 
char* Rus(const char* text)
{
    CharToOem(text, bufRus);
    return bufRus;
}
Добавлено через 4 часа 8 минут
Так символ конца файла представляется только если открыть файл в <двоичном> режиме??
В текстовом я так понимаю, его никак поставить нельзя (т.к. он невидим)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2012, 16:12     как поставить EOF?
Посмотрите здесь:

C++ Int Eof
C++ Очистить поток от EOF
C++ Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF)
C++ Как ввести EOF с клавиатуры?
C++ std::cin, eof не всегда принимается как признак конца файла
C++ EOF K&R
Как детектировать EOF с fgets/gets C++
C++ \n \0 EOF
C++ Поставить рандомную матрицу, перепробовал уже много способов. Как поставить?
Когда и как срабатывает eof() ? C++
C++ Не работает while (!***.eof() !
Прочитать символы из файла, используя eof() (программа работает не так, как ожидается) C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
841 / 723 / 157
Регистрация: 13.01.2012
Сообщений: 1,667
31.01.2012, 16:44     как поставить EOF? #2
нет никакого eof в конце файла - это абстракция. а бесконечный цикл может быть если открываемый файл не существует
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
31.01.2012, 16:52     как поставить EOF? #3
Цитата Сообщение от DPS Посмотреть сообщение
Если же я открываю файл, созданный вот так: создать-тесктовый файл и ввожу в него текст, то потом при попытке чтения из него получается бесконечный цикл(видимо, нельзя найти конец файла). Посоветуйте, пожалуйста, что можно сделать в данной ситуации... Читал про символ EOF, но, честно говоря, так и не понял как можно его поставить.
Попробуйте добавить в конец файла символ
Код
'\n'
Добавлено через 46 секунд
Цитата Сообщение от retmas Посмотреть сообщение
это абстракция.
Смотря что иметь ввиду. Не нужно забывать, что для виндовс существует символ #26.
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
31.01.2012, 16:57  [ТС]     как поставить EOF? #4
ну как же определяется конец файла?? Если я создам файл с помощью, допустим
C++
1
2
3
4
5
6
7
char namefile[90];
 
    cin.getline(namefile,89);
 
    ofstream out(namefile);
 
    out<<12<<34<<45;
Файл создается, и в дальнейшем при считывании файла вот это (если поток ifstream in):
C++
1
2
3
4
5
        while(!in.eof())                        
        {                                                      
                in.getline(buffer,80);
                cout<<buffer<<endl;
        }
работает корректо, т.е., видимо, программа дописывает этот символ.

Если же я создаю файл с помощью простого создать-текстовый файл, а затем открываю его, получается бесконечный цикл, т.к. невозможно распознать, где файл кончается. Как я могу показать в тексте, что файл окончен?

Или функция EOF() работает, только если файл открыть в <двоичном> режиме?
retmas
Жарю без масла
841 / 723 / 157
Регистрация: 13.01.2012
Сообщений: 1,667
31.01.2012, 17:00     как поставить EOF? #5
Цитата Сообщение от go Посмотреть сообщение
Смотря что иметь ввиду. Не нужно забывать, что для виндовс существует символ #26
не думаю, что при програмной записи текста в файл, или ручном(через блокнот, например) в конец будет записан этот символ. а бесконечный цикл - только из-за того, что поток приходит в состояние fail(без установки eof), если файл не найден. и не стоит мудрить с
Цитата Сообщение от go Посмотреть сообщение
'\n'
и еще чем-то

Добавлено через 1 минуту
DPS, пишите
C++
1
2
3
4
5
        while(in)                        
        {                                                      
                in.getline(buffer,80);
                cout<<buffer<<endl;
        }
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
31.01.2012, 17:08  [ТС]     как поставить EOF? #6
Я дописал в конец файла '\n', в результате мне было выведено "файл" успешно открыт, и цикл
C++
1
2
3
4
5
 while(!in.eof())                       
        {                                                    
                in.getline(buffer,80);
                cout<<Rus(buffer)<<endl;
        }
выполнятся не стал.

Добавлено через 1 минуту
C++
1
2
3
4
5
        while(in)                        
        {                                                      
                in.getline(buffer,80);
                cout<<buffer<<endl;
        }
а при этом из файла выводится только одна строчка(((
Yandex
Объявления
31.01.2012, 17:08     как поставить EOF?
Ответ Создать тему
Опции темы

Текущее время: 23:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru