Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2012, 11:30   #1
God_father
 
Регистрация: 26.01.2012
Сообщений: 8
По умолчанию как закончить ввод???(поставить EOF в конце файла)

Ребят, просветите пожалуйста в следующем вопросе: вот в самом низу приведен элементарный листинг чтения файла. Как известно, программа распознает конец файла, когда натыкается на символ EOF.

Если я создаю файл с помощью потока,например, вот так:
char namefile[90];

cin.getline(namefile,89);

ofstream out(namefile);

out<<12<<34<<45;

то программа дописывает этот символ, и в дальнейшем цикл, который я выделил красным цветом в листинге, выполняется без проблем, и на экран все выводится корректно.

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

Код:
#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;
}
Надеюсь, что правильно сформулировал вопрос.

Последний раз редактировалось ACE Valery; 02.02.2012 в 00:09.
God_father вне форума Ответить с цитированием
Старый 01.02.2012, 11:37   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

out.close() ?

Кстати, можно использовать тег [CODE] (значок # ) для сохранения форматирования и подсветки кода в сообщении. Кнопка Правка снизу справа.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.02.2012, 11:46   #3
God_father
 
Регистрация: 26.01.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
out.close() ?
Я имею ввиду, что мне написать в блокноте, чтобы программа обнаружила конец файла??? В конце текста как-нибудь можно показать, что я закончил набивать текст. Вот проблема в том, что если файл создается с помощью потока, программа как-то дописывает этот символ, и цикла бесконечного не получается, т.к. программа как-то узнает, что файл закончен.

А то вот тут бесконечность получается если файл создать обычным способом, а не через поток:
Код:
while(!in.eof()) 
 { 
 in.getline(buffer,80);
 cout<<Rus(buffer)<<endl;
 }
God_father вне форума Ответить с цитированием
Старый 01.02.2012, 12:05   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не уверен в причине этого, но как-то так (т.е. endl или close() нужен):
Код:
    ofstream out("abc1.txt");
    out << 12 << 34 << 45 << endl;
    out << 999999;
   //out.close(); //uncomment me!

    string str;
    ifstream in("abc1.txt");
    while(!in.eof())
    {
        getline(in, str);
        cout << str << endl;
    }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 01.02.2012 в 12:09.
Alex11223 вне форума Ответить с цитированием
Старый 01.02.2012, 12:21   #5
God_father
 
Регистрация: 26.01.2012
Сообщений: 8
По умолчанию

Цитата:
ofstream out("abc1.txt");
out << 12 << 34 << 45 << endl;
out << 999999;
//out.close(); //uncomment me!
Alex11223, если файл создается с помощью потока, то что бы ты не отправил туда, все будет корректно, т.е. при закрытии файла, созданного таким образом, каким-то образом EOF автоматически дописывается сам... И в последующем я спокойно открою его, и данный цикл прочтет его. out.close() это понятно, чтобы закрыть поток. Вот может именно этот метод и дописывает символ конца файла???

Но попробуй создать файл обычным способом, открыв блокнот и напечатав что-нибудь в нем. Потом, как только ты закроешь блокнот, и откроешь его с помощью потока, цикл почему-то не сможет найти EOF. Ума не приложу, почему так.

Цитата:
string str;
ifstream in("abc1.txt");

while(!in.eof())
{
getline(in, str);
cout << str << endl;
}
God_father вне форума Ответить с цитированием
Старый 01.02.2012, 14:18   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Эм...Создал, написал, сохранил (даже не закрывал блокнот) — всё работает и всегда работало.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 01.02.2012, 15:16   #7
God_father
 
Регистрация: 26.01.2012
Сообщений: 8
По умолчанию

Странно.... надо будет попробовать в другом компиляторе запустить... Проблема в том, что файл, который я создаю обычным путем, отказывается читаться до конца...
Спасибо за помощь!
God_father вне форума Ответить с цитированием
Старый 01.02.2012, 15:20   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Может блокнот плохой?) Стандартным вин7 блокнотом, всё читается и скомпилированной в Visual C++ 2010, и Dev-C++.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод EOF c консоли - это Ctrl+Z и Ctrl+M Почему? 8Observer8 Общие вопросы по программированию, компьютерный форум 10 13.01.2023 09:33
Получить имя файла из ссылки(в конце ссылки нет имени файла) Человек_Борща Работа с сетью в Delphi 11 05.06.2011 15:15
как поставить ограничение на ввод нуля? Dr.Swat Общие вопросы Delphi 5 14.06.2010 06:43
Как задать EOF? Geolaz Общие вопросы C/C++ 24 17.01.2010 22:16
Delphi 7, удалить символ в конце файла Flame_of_Death Помощь студентам 5 10.08.2009 06:32