2016-10-13 4 views
0

Я просмотрел определение функции flush в C++, и у меня есть некоторые действительно удовлетворительные ответы, но я недавно натолкнулся на следующий код, и я не могу понять, что использование флеша здесь имеет большое значение, кажется, что код дает допустимый результат даже без использования флеша. Пожалуйста, помогите!Функция флеша в cpp

#include <iostream> 
using namespace std; 

class person { 
public: 
    int ph_no; 
    char name[50]; 
    void accept() { 
     cout<<"\nEnter name"; 
     cin>>name; 
     cout<<"\nenter ph_no"; 
     cin>>ph_no; 
    } 
    void display() { 
     cout<<"name:"<<name<<"\n"; 
     cout<<"phone_no:"<<ph_no<<"\n" ; 
    } 
}; 

int main() { 
// a few other functions to create file and read file &c &c. 
    person p; 
    int pno,pos,choice,offset,i; 
    fstream fp; 
    char name[20]; 

    cout<<"\n enter name"; 
    cin>>name; 
    fp.open("d:\\test.dat",ios::out|ios::in|ios::ate|ios::binary); 
    fp.seekg(0,ios::beg); 
    pos=-1; 
    i=0; 
    while(fp.read((char *)&p,sizeof(p))) { 
     if((strcmp(name,p.name))==0) { 
          pos=i; 
          break; 
     } 
     i++; 
    } 
    offset=pos*sizeof(p); 
    fp.seekp(offset); 
    cout<<"\ncurrent phno:"<<p.ph_no; 
    cout<<"\nenter new phone no"; 
    cin>>pno; 
    p.ph_no=pno; 
    fp.write((char *)&p,sizeof(p))<<flush; 
    cout<<"\nrecord updated\n"; 
    fp.seekg(0); 
    while(fp.read((char *)&p,sizeof(p))) { 
        p.display(); 
    } 
    fp.close(); 
    return 0; 
} 
+0

Где вы ожидали, что «флеш» будет иметь значение? –

+0

'fstream :: write' возвращает' basic_ostream & ', поэтому все должно быть хорошо, хотя я бы назвал его в следующей строке для ясности. – krzaq

ответ

2

std::cout и std::cin являются tied

привязанной поток представляет собой выходной поток, который объект очищается перед каждой операцией в/о в this объекте потока.

По умолчанию стандартные узкие потоки cin и cerr привязаны к COUT, и их широкие аналоги характера (wcin и wcerr) в wcout. Библиотечные реализации могут также связывать clog и wclog.

Что касается:

fp.write((char *)&p,sizeof(p))<<flush; 
cout<<"\nrecord updated\n"; 
fp.seekg(0); 
// the next read will return the correct info even without the 
// prev flush because: 
// - either the seekg will force the flushing, if the seek-ed 
// position is outside the buffer range; *or* 
// - the seekg pos is still inside the buffer, thus no 
// I/O activity will be necessary to retrieve that info 
while(fp.read((char *)&p,sizeof(p))) 
0

Flush силы любой буферном выход на самом деле выйти на устройство. Для производительности C++ обычно выполняет буферизацию ввода-вывода. Это означает, что он хранит некоторые данные в памяти и ждет, пока он не будет иметь большую сумму, прежде чем говорить с устройством вывода. Говоря с устройством реже с большими объемами данных каждый раз, когда ваш IO намного быстрее.

Буферизация может вызвать проблемы в интерактивной ситуации. Если приглашение пользователя находится в буфере и не отображается пользователю, пользователь может быть немного сбит с толку. Поэтому, когда вам нужно убедиться, что ваш последний вывод фактически отображается, вы используете флеш.

+0

Большое вам спасибо за ответы! Кажется, теперь это гораздо больше смысла! : D: D –

Смежные вопросы