Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cin.get() в цикле 
:(
    Опции темы
DFooz
Дата 26.10.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



вот код
Код

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>      // (or stdlib.h) for exit()
const char * file = "guests.dat";
const int Len = 40;
int main()
{
    char ch;
// show initial contents
    ifstream fin;
    fin.open(file);

    if (fin.is_open())
    {
        cout << "Here are the current contents of the "
             << file << " file:\n";
        while (fin.get(ch))
            cout << ch;
    }
    fin.close();

// add new names
    ofstream fout(file, ios::out | ios::app);
    if (!fout.is_open())
    {
        cerr << "Can't open " << file << " file for output.\n";
        exit(1);
    }

    cout << "Enter guest names (enter a blank line to quit):\n";
    char name[Len];
    cin.get(name, Len);
    while (name[0] != '\0')
    {
        while (cin.get() != '\n')
            continue;   // get rid of \n and long lines
        fout << name << "\n";
        cin.get(name, Len);
    }

    fout.close();

// show revised file
    fin.clear();    // not necessary for some compilers
    fin.open(file);
    if (fin.is_open())
    {
        cout << "Here are the new contents of the "
             << file << " file:\n";
        while (fin.get(ch))
            cout << ch;
    }
    fin.close();
    cout << "Done.\n";
    return 0;
}


Я вот не понимаю эту конструкцию, а если точнее, то зачем нужен ещё этот цикл?
while (cin.get() != '\n')
            continue;

Если его убрать, то у меня записывается в файл только одна строка... хотя name[0] не равно '\0'. Что я упустил?  smile Можно, то поподробнее, а то в потоках как-то сразу много информации и сразу во всём и не разберёшься smile 

Код

    while (name[0] != '\0')
    {
        while (cin.get() != '\n')
            continue;   // get rid of \n and long lines
        fout << name << "\n";
        cin.get(name, Len);
    }

PM MAIL   Вверх
Kuvaldis
Дата 26.10.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



DFooz, 
Цитата

Я вот не понимаю эту конструкцию, а если точнее, то зачем нужен ещё этот цикл?
while (cin.get() != '\n')
            continue;
Если его убрать, то у меня записывается в файл только одна строка... хотя name[0] не равно '\0'.


Дело вот в чем
метод get(char* str, int n) класса istream рабтатает так:
из входного потока вычитывается строка не длиннее, чем (n - 1) символ. Если строка короче, то признаком окончания ввода строки является символ '\n'. Причем данный символ из входного потока НЕ УБИРАЕТСЯ. Допустим, что LEN = 3
МЫ вводим строку "12", завершая ввод нажатием Enter.
Во входном потоке это будет представлено так:
'1', '2', '\n'.    Так как входная строка меньше, чем 3, то прочитаются и запишутся символы '1' и '2' и '\0' (указатель на конец строки). Указатель потока будет установлен на '\n'. Если не использовать цикл с continue, то при следующем чтении сразу будет найден символ конца ввода. И так таким образом первым и последним записанным символом станет '\0'. А это выход из цикла

Зачем еще нужен в данном случае вышеупомянутый цикл:
допустим, что мы вводим строку "12345"
Записать мы должны "12", а все остальное придется выбросить из потока (при помощи чтения): оставшиеся символы 345 и '\n'.
Если этого не сделать, то получится следующая картина.
Введется:
12
34
5

Перечитай еще раз, как работает get() (или пока не ввод, или пока не прочитали в данном случае 2 символа)


Это сообщение отредактировал(а) Kuvaldis - 26.10.2006, 23:24


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
DFooz
Дата 28.10.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 3.9.2006

Репутация: нет
Всего: нет



понятно. Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0448 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.