003
04.11.2007, 16:46 Uhr
~Kelloggs
Gast
|
Hallo Kronos,
read() liest ungepuffert. Wenn, wäre fread() das Mittel der Wahl, aber genau dieses möchte ich praktisch selbst schreiben und an meine Bedürfnisse anpassen.
Habe das Programm nochmal überarbeitet.
Es funktioniert zwischenzeitlich, mit einer Ausnahme: bei einer angeforderten Blockgröße von 1 Byte stimmt. Lässt sich also benutzen wie fread() außer mit 1 Byte Blockgröße
C++: |
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h>
ssize_t read_buffered(int fd, void* destbuff, size_t wantedblock) { static char prebuff[4096]; // der Buffer der Funktion static int offset = 0; //Offset zum Zugriff auf den Speicher (bytes gelesen seit read) int readbytes = 0; //die in diesem Funktionsaufruf gelesenen bytes static int leftbytes = 0; //wieviele bytes noch aus dem prebuff gelesen werden müssen static ssize_t filereader;
do {
if(leftbytes == 0) //und ggf. neu einlesen { filereader = read(fd, prebuff, 4096); offset = 0; leftbytes = filereader; }
if(wantedblock <= leftbytes) // wenn der gewünschte block kleiner als die noch im buffer vorhandenen bytes sind { memcpy(destbuff + readbytes, prebuff + offset, wantedblock); readbytes = readbytes + wantedblock; offset = offset + wantedblock; leftbytes = leftbytes - wantedblock; wantedblock = 0; } else // wenn der vorhandene speicher zu klein oder gleich groß der anfrage ist { memcpy(destbuff + readbytes, prebuff + offset, leftbytes); offset = offset + leftbytes; readbytes = readbytes + leftbytes; wantedblock = wantedblock - leftbytes; leftbytes = 0; } }while(wantedblock != 0 && filereader != 0); //solange der schreibanforderung nicht gerecht wurde und der filereader noch einen wert zurückgibt
return readbytes; }
|
|