2015-08-14 3 views
-1

C++ Например, у меня есть файл с именем Bjarne.txt и в нем есть целые числа:Misunderstood использование cin.unget() при работе с файлами I/O

16 2 3 4 

Я сделал программу, чтобы прочитать целые числа, доступные внутри файла и выводить их мне в окно консоли, однако, я пытаюсь использовать cin.unget() и что получить понимание того, что он делает на самом деле, вот исходный код:

#include <iostream>  
#include <fstream>  
using namespace std; 

int main() { 
ifstream ifs("Bjarne.txt"); 
int a; 
for(int i = 0;i<4;++i){ 
    ifs>>a; 
    cout<<endl<<a; 
    if(i==0){ 
    ifs.unget(); 
    } 
} 

и выход это:

16 6 2 3 

Почему такой выход? (это должно быть 16 2 3 4), это происходит только тогда, когда я помещаю ifs.unget() в программу, поэтому мои вопросы таковы, какова цель cin.unget() при использовании файлов ввода-вывода и почему это число 6 (как часть 16) получать вывод?

Заранее благодарим за любую помощь.

+0

Почему вы пытаетесь использовать 'cin.unget()', если у вас нет понимания того, что он делает? И почему вы не прочитали его документацию, чтобы узнать? –

+0

Итак, вы получили свой ответ? –

ответ

1

Что-то не так с the documentation?

Делает последний извлеченный символ доступным снова.

В конце первой итерации цикла, 6 был последним экстрагированным характер (в качестве конечной цифры извлеченного отформатированного int со значением 16).

Unget делает именно то: это un-получает it.

Следующая операция имеет 6 для работы. Итак, неожиданно, вы получите 6 в следующий раз.

+0

Предположим, у меня есть такой код: https://ideone.com/lh9YeA Если я приведу например «123456», выход будет «123456», если бы он был без cin.unget(), выход был бы " 23456 ", поэтому он не обязательно (cin.unget()) делает последний извлеченный символ доступным снова, но делает первый символ доступным снова в примере в ссылке выше, почему? – zLeon

+0

@zLeon: потому что у вас есть 'cin.get()' операция в начале 'main', которая съедает первую цифру ...... вы не читаете свой собственный помощник по коду! 'unget' _does_ делать то, что рекламируется. 'Unget' является _before_ извлечения в' a', поэтому я не знаю, о чем вы говорите, с этим бизнесом «первого персонажа». В то время, когда выполняется 'unget', он _does_ снова получает последний извлеченный символ (' 1'). –