Avatar billede mxs Nybegynder
02. juni 2006 - 17:03 Der er 10 kommentarer

istream og ostream. Hvordan skal jeg lige klare dette?

Hej eksperten.dk

Jeg er igang med at lave et socket bibliotek, og jeg vil egentlig gerne have den til at opføre sig som en stream, men hvordan gør jeg lige det? Mit første gæt var måske at nedarve istream og ostream ned i min klasse, men jeg er kommet frem til at dette måske er en sløset løsning. Jeg mangler også noget læsestof omkring iostream klassen, hvor der meget klart bliver beskrevet hvad de enkle members gør. Er det noget I kan give noget råd om?

På forhånd tak,
Martin Slot
Avatar billede arne_v Ekspert
02. juni 2006 - 17:24 #1
du er ikke den foerste som har faaet den ide

proev og google lidt

http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html
http://socketstream.sourceforge.net/
etc.
Avatar billede mxs Nybegynder
02. juni 2006 - 17:38 #2
Nej nej, det aner mig godt, men så til mit andet spørgsmål. Hvis jeg gerne vil sætte mig ind i iostream biblioteket, hvilken bog beskriver det så bedst?
Avatar billede mxs Nybegynder
02. juni 2006 - 17:40 #3
I den første kan jeg se at << de bare bruger >>. SKal der ikke mere til? Altså jeg havde jo i tankerne at nedarve fra iostream, men det kan være at det er overkill?
Avatar billede bertelbrander Novice
02. juni 2006 - 20:38 #4
Jeg lavede en gang en class til at oversætte æøå ved udskrivning til std::cout på windows.
Du burde kunne bruge det samme princip med en socket stream.
Du skal nok overveje hvad der skal få den til at sende. Min class sender hver gang der skrives til stream'en

#include <windows.h>
#include <iostream>

class OutStreamClass : public std::streambuf, public std::ostream
{
public:
  OutStreamClass() : std::ostream(this)
  {
      setf(std::ios::unitbuf);
  }
protected:
  int overflow(int c)
  {
      if(pbase() && pptr() != pbase())
      {
        *pptr() = 0;
        CharToOem(pbase(), pbase());
        std::cout << pbase();
      }
      setp(Buffer, Buffer + sizeof(Buffer) - 1);
      if(c != EOF)
      {
        *pptr() = char(c);
        pbump(1);
      }
      return 0;
  }
  int sync()
  {
      if(pbase() && pptr() != pbase())
      {
        *pptr() = 0;
        CharToOem(pbase(), pbase());
        std::cout << pbase();
      }
      setp(Buffer, Buffer + sizeof(Buffer) - 1);
      return 0;
  }
private:
  char Buffer[1024];
};

int main()
{
  OutStreamClass OutStream;
  OutStream << "æøå";
  OutStream << 123 << "ÆØÅ" << std::endl;
}
Avatar billede mxs Nybegynder
03. juni 2006 - 00:01 #5
Altså man skal se hvad for members man skal overloade? Tror jeg skal sætte mig lidt mere ind i ostream og istream før jeg går igang!
Avatar billede bertelbrander Novice
03. juni 2006 - 00:05 #6
De vigtige er overflow og sync, der (så vidt jeg husker) begge er member af streambuf.

Hvis du vil lave input stream skal du overloade underflow og uflow. Jeg tror godt jeg kan finde et eksempel hvis det ønskes.
Avatar billede arne_v Ekspert
03. juni 2006 - 01:12 #7
de members som er pure virtual skal du overloade

de members som er virtual må du overveje om de bør overloades

men kig i nogle forskellige implementationer - Bertels, mine link ovenfor
etc. - der er sikkert nogle fællestræk
Avatar billede mxs Nybegynder
03. juni 2006 - 01:39 #8
Ja ok. Kan godt se at jeg skal instantiere de pure virtuelle :) Jeg kan godt se hvad overflow gør, men sync må jeg lige tjekke op om. Ikke nu da jeg er for træt til at overskue noget, men ellers skal jeg vel bare igang med at lære iostreamen at kende. Det er vel altid et udgangspunkt, og se på nogen eksempler, men at finde et eksempel til mig ville være dejlig, da jeg er lidt på bar bund med hvad jeg skal lede og kigge efter, da min eneste omgang med disse klasser er at bruge dem. Jeg har aldrig taget et kig på dem "under motorhjelmen", hvilket jeg tror vil gavne mig meget i denne situation.
Avatar billede mxs Nybegynder
17. december 2008 - 10:19 #9
Bertel og arne_v, smid et svar hver og jeg deler pointene mellem jer. I hjalp mig faktisk lidt meget med dette problem.
Avatar billede arne_v Ekspert
17. december 2008 - 15:08 #10
svar
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