Функция сброса в cpp

#c #fstream #flush

#c #fstream #сброс

Вопрос:

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

 #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 amp;c amp;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 *)amp;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 *)amp;p,sizeof(p))<<flush;
   cout<<"nrecord updatedn";
   fp.seekg(0);
   while(fp.read((char *)amp;p,sizeof(p))) {
                  p.display();
   }
   fp.close();
   return 0;
 }
  

Комментарии:

1. где вы ожидали flush , что это изменит ситуацию?

2. fstream::write возвращает basic_ostreamamp; , так что все должно быть в порядке, хотя я бы назвал это в следующей строке для ясности.

Ответ №1:

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

Связанный поток — это объект выходного потока, который сбрасывается перед каждой операцией ввода-вывода в this объекте stream.

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

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

 fp.write((char *)amp;p,sizeof(p))<<flush;
cout<<"nrecord updatedn";
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 *)amp;p,sizeof(p)))
  

Ответ №2:

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

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

Комментарии:

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