PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C (linux) befehl read()


firfin
2010-10-24, 18:31:40
hallo,

angenommen ich habe einen buffer:

char *read_buf;
read_buf = (char *) malloc (1048576);

wenn ich jetzt in einer schleife von einem file in den buffer schreiben möchte:


while (rd)
{
rd = read (fd1, read_buf, iBytesToRead);
}


... habe ich doch "das problem": der read_buf wird sozusagen bei jedem schleifendurchlauf wieder ab index 0 (also bei der gleichen adresse) überschrieben? ist das richtig?

Nagelbrett
2010-10-24, 18:38:02
Ja das ist richtig.
Wenn du das nicht willst, kannst du z.B. einen zweiten Pointer anlegen, den du nach jedem Read um die gelesenen Bytes erhöhst.

Gast
2010-10-24, 18:41:21
das siehst du richtig.
anstatt read_buf kannst du read_buf+idx schreiben, wobei idx halt ne int variable sein muss, wieviel bytes du schon gelesen hast.
dabei natürlich aufpassen dass du nie über die grösse von read_buf gehst...

also iBytestoread+idx darf nie grösser als 1048576 sein

firfin
2010-10-24, 18:42:49
ok...

das habe ich auch schon auf verschiedenste Weise probiert, aber ich bekomme immer eine segmentation fault fehlermeldung...


zb so :

while (rd)
{
rd = read (fd1, read_buf, iBytesToRead);
read_buf = read_buf + rd;
}

und das file ist nich zu groß, welches ich auslese...

Nagelbrett
2010-10-24, 18:54:32
Poste mal mehr Code, das kann ja dann fast nur bei einer eventuellen Ausgabe o.ä. passieren.
Merkst du dir in deinem Beispiel überhaupt noch die Anfangsadresse von deinem allokierten Bereich?

firfin
2010-10-24, 19:05:55
..

Funky Bob
2010-10-24, 19:15:17
ok...

das habe ich auch schon auf verschiedenste Weise probiert, aber ich bekomme immer eine segmentation fault fehlermeldung...


zb so :

while (rd)
{
rd = read (fd1, read_buf, iBytesToRead);
read_buf = read_buf + rd;
}

und das file ist nich zu groß, welches ich auslese...


So sollte es gehen:

char *read_buf = (char*)malloc(sizeof(char)*1048576);
ssize_t bytenum;
unsigned int position = 0, maxPos = 1048576;
while((position+iBytesToRead)<maxPos){
bytenum = read (fd1, ((char*)read_buf+position), iBytesToRead);
if(bytenum==(ssize_t)-1)
{
perror("Readerror");
exit(-1);
}
position += bytenum;
}
printf("Puffer voll\n");


Habe es jetzt nicht getestet und ide Datentypen sind die von Solaris, aber die Idee sollte klar sein.

S8472
2010-10-24, 19:37:10
Bei der for-Schleife, in der du iChecksum erstellst fängst du bei der in der while Schleife veränderten Adresse von read_buf mit dem Auslesen an und läufst so natürlich zwangsweise aus deren Speicherbereich raus. Speichere dir den Offset beim Dateiauslesen lieber in einer extra Variable. die kannst du dann auch später noch nutzen, um nicht unnötig viele leere Elemente weiterzuverarbeiten ;-).
while (rd)
{
rd = read (fd1, &read_buf + offset, iBytesToRead);

iReads++;
offset += rd;

//read_dummy++; //= iBytesToRead;
}
for (i = 0; i < offset; i++)
{

iChecksum += read_buf[i];

}

firfin
2010-10-24, 19:47:37
eijajai....

ok das war bläd.... funzt jetzt, das problem lag vorher woanders und da vergesse ich mal eben schnell was sich da unten noch rumtümmelt ;)

thx!