Permalänk
Medlem

[C++] streams buffers

Hur får jag en char buffer att skrivas till en ostream så att den kan hämtas av andra object via en streambuf?

char buffer -> ostream -> streambuf

streambuf * sb; ostream os(sb); char * buffer = "Hello"; os.write(buffer, 5); os.flush(); cout << sb;

Funkar ej!

Visa signatur

Om man inget frågar, får man inget veta.
Athlon XP T-bred 2200+ (180*10) | Epox 8RDA3+ | 2*256 PC3200 Twinmos + 512 PC3200 Kingston | 80 Gb Samsung SpinPoint P80 SATA | Gigabyte Radeon 9600Pro (460, 330)

Permalänk
Medlem

vad är det som inte funkar??

du kan testa med att allokera en streambuf istället för att ha en pekare som pekar ut i rymden

http://www.cplusplus.com/ref/iostream/streambuf/

Permalänk
Medlem

Jo men konstruktorn är protected. Går liksom inte att instansiera objektet. Det som inte funkar är mycket riktigt att instansieringen av "os" krashar.

Om jag missuppfattat vad du menar med allokera så skriv gärna ner en liten kodsnutt.

Visa signatur

Om man inget frågar, får man inget veta.
Athlon XP T-bred 2200+ (180*10) | Epox 8RDA3+ | 2*256 PC3200 Twinmos + 512 PC3200 Kingston | 80 Gb Samsung SpinPoint P80 SATA | Gigabyte Radeon 9600Pro (460, 330)

Permalänk
Medlem

om du läser det som står på sidan jag länkade till så ser du att du inte kan skapa en streambuf eftersom det är en abstrakt basklass

Permalänk
Medlem

Aha.. har suttit och lusläst alla metoder men texten under verkade inte så intressant =). Har ni några förslag på hur jag ska skriva en implementation av streambuf så att en ostream kan skriva till den och en istream kan läsa från samma streambuf.

EDIT: ska skriva ner och hämta binärdata

Visa signatur

Om man inget frågar, får man inget veta.
Athlon XP T-bred 2200+ (180*10) | Epox 8RDA3+ | 2*256 PC3200 Twinmos + 512 PC3200 Kingston | 80 Gb Samsung SpinPoint P80 SATA | Gigabyte Radeon 9600Pro (460, 330)

Permalänk
Medlem

har aldrig gjort något sådant

Permalänk
Medlem

Tack ändå. Har ändå pekat åt rätt håll. Någon annan som är bättre på sånt här? Själv är jag rätt grön på C++.

Visa signatur

Om man inget frågar, får man inget veta.
Athlon XP T-bred 2200+ (180*10) | Epox 8RDA3+ | 2*256 PC3200 Twinmos + 512 PC3200 Kingston | 80 Gb Samsung SpinPoint P80 SATA | Gigabyte Radeon 9600Pro (460, 330)

Permalänk
Medlem
Citat:

Hur får jag en char buffer att skrivas till en ostream så att den kan hämtas av andra object via en streambuf?

Om andra objekt ska kunna läsa in det som ligger i strömmen måste de få eller ha en referens till den strömmen. Då kan de lika gärna ha en pekare till ett objekt som har medlemsfunktioner som kan hämta/skicka en intern binär buffer, av t.ex. typ char* eller en vektor av char om hastighet inte är av yttersta vikt.

Då kan alla objekt helt enkelt fråga det objektet efter sin nuvarande buffer och om något objekt vill sätta buffern kan de göra det. Nackdelen med char* är att du måste sätta/läsa längden så att du vet hur lång buffern är. Kör du med vector<char> i bufferobjektet så sköter den själv längden.

Så min fråga är: Varför mellanlanda i en ström, varför inte hämta datat direkt?

Om du skriver ut datat i en ström kan bara ett objekt läsa det, sen är det ju borta från strömmen. Kanske det du ville iofs? Det kan iofs en medlemsfunktionen som skickar datat göra också.

Om du förklarar vad det är du vill göra och inte hur du tänkt göra det kanske jag kan hjälpa dig bättre.

Permalänk
Medlem

Nja min frågeställning har ändrats lite.

Min tanke var att alla ska ärva från samma abstrakta klass som funkar ungefär såhär:

istream->buffer1->ostream->buffer2

Alla buffrar skall ha en begränsad storlek för att den inte ska använda för mycket minne. SÅ jag måste ha kontroll var senaste skriv och senaste läs gjordes. Kommer därför använda mig av streams så jag kan använda streambuffers vilka har ganska mysiga funktioner för detta. Detta är tyvärr tvunget för att olika objekt kommer att ha olika blockstorlek. Ett objekt kanske hämtar 20 bytes åt gången ett annat hämtar 12. En anledning att lägga in en ostream och inte bara låta nästa objekt läsa är att jag kommer att utföra en del operationer på buffer1 innan jag skriver ner den till buffer2.

Så jag har egentligen löst problemet fast det kanske finns bättre sätt att göra det. Snabbhet är av vikt så vektor är uteslutet. Så min fråga blir egentligen; är det ok att änvända strstream/strstreambuf för mitt ändamål? Bör jag akta mig då de är deprecated?

Visa signatur

Om man inget frågar, får man inget veta.
Athlon XP T-bred 2200+ (180*10) | Epox 8RDA3+ | 2*256 PC3200 Twinmos + 512 PC3200 Kingston | 80 Gb Samsung SpinPoint P80 SATA | Gigabyte Radeon 9600Pro (460, 330)