Avatar billede zyxtem Nybegynder
09. oktober 2003 - 21:41 Der er 12 kommentarer og
1 løsning

Problem med at forstå noget fra en eng tutorial

hej

  Jeg sad og læste en engelsk tutorial om C++ men fatter ikke følgene linier:

  cout<<"text"<<endl;

  The end manipulator outputs a newline ans flushes the stram. Because cout is buffered output may not be displayed when first written. Flushing the stream forces the contents of the buffer to be output.

  Ved godt den giver en ny linie men alt det med "buffered og flushed" fatter jeg overhovedet ikke....
  En der har en god forklaring??
Avatar billede arne_v Ekspert
09. oktober 2003 - 21:43 #1
buffered betyder at i stedetfor at skrive teksten til skærmen med
det samme, så gemmer den teksten i memeory og venter lidt og
ser om der kommer mere som skal skrives ud.

flushe betyder at tvinge den til at skrive alt i bufferen ud til
skærmen med det samme.
Avatar billede zyxtem Nybegynder
09. oktober 2003 - 21:50 #2
Det vil sige at:

cout<<"hej"<<endl;
cout<<"med"<<endl;
Her bliver de skrevet ud hver for sig

mens her:
cout<<"hej";
cout<<"med"<<endl;
bliver de skrevet ud samtidig
Avatar billede arne_v Ekspert
09. oktober 2003 - 21:53 #3
Ikke nødvendigvis.

Hvorvidt den buffere er ikke angivet i C++ standarden.

Det er compiler og platform specifikt.

Den tekst du referer siger "may" ikke "will".

Pointen er at du ikke skal basere din program logik på at
tingene bliver skrevet ud øjeblikkeligt.

Fordi det kan være forskelligt på forskellige platforme.
Avatar billede zyxtem Nybegynder
09. oktober 2003 - 22:00 #4
Men hvad kan jeg så bruge det til? Er det bare noget man skal vide eller kan det med buffere og flush komme mig til nytte en dag?
Avatar billede arne_v Ekspert
09. oktober 2003 - 22:01 #5
Lad mig komme med et konkret eksempel.

#include <iostream>

using namespace std;

#include <unistd.h>

int main()
{
  for(int i=0;i<15;i++) {
      cout << ".";
      sleep(1);
  }
  cout << endl;
  return 0;
}


vil muligvis virke som: skriv et punktum, vent 1 sekund, skriv 1 punktum,
vent 1 sekund ... - men kan også virke som vent 15 sekudner, skriv
15 punktummer.

#include <iostream>

using namespace std;

#include <unistd.h>

int main()
{
  for(int i=0;i<15;i++) {
      cout << ".";
      cout.flush();
      sleep(1);
  }
  cout << endl;
  return 0;
}

vil derimod altid give den ønskede effekt.

[unistd.h er en Posix header fil som de fleste Windows compilere mangler -
hvis du skulle få kyst til at teste]
Avatar billede arne_v Ekspert
09. oktober 2003 - 22:02 #6
Det er noget man bør vide som programmør.

Så man ikke undgår "fejl" i sin logik.
Avatar billede zyxtem Nybegynder
09. oktober 2003 - 22:03 #7
Det vil sige at i et loop hvor jeg ikke flusher bliver det hele samlet i bufferen? og så først udskrevet til sidst?
Avatar billede arne_v Ekspert
09. oktober 2003 - 22:05 #8
Muligvis gør det ikke.

Muligvis gør det.

Det afhænger af din compile/platform.

Pointen er at du ikke kan tillade dig at antage hverken det en eller det
andet.
Avatar billede zyxtem Nybegynder
09. oktober 2003 - 22:07 #9
lige et lille tillægsspørgsmål. I nogle af dine gamle grogrameksempler navngiver du ofte en char * til buffer. Er dette bare for at indikerer at den skal indeholde noget data midlertidig?
Avatar billede arne_v Ekspert
09. oktober 2003 - 22:13 #10
En buffer er "midlertidigt lager".

C++ kan have en buffer jævnfør ovenstående indlæg.

Men det kan ens applikation også.

Hvis jeg skal have en klump bytes som jeg skal bruge til noget, så
vil jeg tit lave char *buffer eller char *buf elller char buffer[1000]
eller char buf[1000].
Avatar billede zyxtem Nybegynder
09. oktober 2003 - 22:15 #11
Mange tak arne.
Avatar billede arne_v Ekspert
09. oktober 2003 - 22:16 #12
Her er et af de eksempler:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
  time_t t = time(NULL);
  cout << ctime(&t) << endl;
  char buf[33];
  strftime(buf,sizeof(buf),"%d-%m-%Y %H:%M:%S",localtime(&t));
  cout << buf << endl;
  return 0;
}

Jeg skal bruge nogle bytes til den formaterede tids-streng.

char buf[33];

Og her der et også midlertidigt lager:

binær tid -> applikations buffer -> C++ buffer -> skærm
Avatar billede ultraper Nybegynder
29. januar 2004 - 14:23 #13
Kan du zyxtem ikke lave et link til tutorialen? eller hvis der er andre der kender en god online tutorial, bare fyr løs!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester