Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Will nicht weiterlesen

40 views
Skip to first unread message

Burkhard Schultheis

unread,
Jul 27, 2012, 1:39:07 PM7/27/12
to
Ich habe hier ein ganz komisches Problem, das mich derzeit fast
verzweifeln lᅵsst. Unter Linux kein Problem, unter Windows aber schon:

Es sollte auf einen Rutsch eine komplette Datei eingelesen werden. Dazu
wurde mit fread alles in einen Puffer eingelesen. Ich musste dann
feststellen, dass im Gegensatz zu Linux die Datei nicht komplett
eingelesen wurde, sondern nur exakt 261040 statt 282260 Zeichen. Ich
habe dann die folgende Schleife programmiert, um die Datei komplett
einzulesen:

for (gelesen = 0;
gelesen < file_size;
gelesen += anz)
{
anz = (int) fread (&buf [gelesen], 1, file_size - gelesen, file);
}

Dabei sind gelesen, anz und file_size natᅵrlich Integerwerte. Aber es
werden immer nur 261040 Bytes beim ersten Mal gelesen, dann werden in
jedem Durchgang keine Bytes mehr gelesen.

Ich habe jetzt gerade gedacht, es kᅵnne etwas damit zu tun haben, wie
die Datei geᅵffnet wird, weil die Grᅵᅵe der entsprechenden Linux-Datei
in etwa 261000 Bytes ist. Aber wenn einen Datei mit fopen im Modus "r"
geᅵffnet wird, muss sie sich doch wie beschrieben verarbeiten lassen,
oder mache ich da einen Denkfehler? Im Puffer sehe ich auch lauter 0D0A,
also mᅵsste doch bis zum Ende gelesen werden!

Was ist da falsch?

ᅵbersetzt wird das ganze immer noch mit VS 6! :-(

Grᅵᅵe
Burkhard

Heiko Rost

unread,
Jul 27, 2012, 1:53:28 PM7/27/12
to
Am Fri, 27 Jul 2012 19:39:07 +0200 schrieb Burkhard Schultheis:

> Es sollte auf einen Rutsch eine komplette Datei eingelesen werden. Dazu
> wurde mit fread alles in einen Puffer eingelesen. Ich musste dann
> feststellen, dass im Gegensatz zu Linux die Datei nicht komplett
> eingelesen wurde, sondern nur exakt 261040 statt 282260 Zeichen.
> ...
> Aber wenn einen Datei mit fopen im Modus "r"
> ge�ffnet wird, muss sie sich doch wie beschrieben verarbeiten lassen,
> oder mache ich da einen Denkfehler?

Schu� ins Blaue: Die Datei wird mit "r" im Textmode ge�ffnet und an
Position 261040 steht ein ^z, das als EOF interpretiert wird. Du
solltest "rb" f�r den Modus probieren.

Gru� Heiko

Burkhard Schultheis

unread,
Jul 27, 2012, 2:31:58 PM7/27/12
to
Daran habe ich auch schon gedacht. Ist aber kein ^z in der ganzen Datei
zu finden!

Ich werde �bers Wochenende mal mit einem ganz simplen Programm der Datei
zu Leibe r�cken, unter Windows und Linux.

Gr��e
Burkhard

Stefan Reuther

unread,
Jul 27, 2012, 2:56:47 PM7/27/12
to
Burkhard Schultheis wrote:
> Am 27.07.2012 19:53, schrieb Heiko Rost:
>> Am Fri, 27 Jul 2012 19:39:07 +0200 schrieb Burkhard Schultheis:
>>> Aber wenn einen Datei mit fopen im Modus "r"
>>> geöffnet wird, muss sie sich doch wie beschrieben verarbeiten lassen,
>>> oder mache ich da einen Denkfehler?
>>
>> Schuß ins Blaue: Die Datei wird mit "r" im Textmode geöffnet und an
>> Position 261040 steht ein ^z, das als EOF interpretiert wird. Du
>> solltest "rb" für den Modus probieren.
>
> Daran habe ich auch schon gedacht. Ist aber kein ^z in der ganzen Datei
> zu finden!

Dennoch wirst du mit Modus "r" weniger Bytes erhalten, als dir 'dir'
anzeigt, weil der aus den 0D0A in der Datei ein einzelnes '\n' macht.
Schau dir mal an, was 'ftell' sagt. Und dann öffne die Datei mit "rb".

Deine Aussage, dass du im Puffer 0D0A siehst, widerspricht eigentlich
der Aussage, dass du die Datei mit "r" öffnest.


Stefan

Claus Reibenstein

unread,
Jul 27, 2012, 4:20:52 PM7/27/12
to
Burkhard Schultheis schrieb:

> Ich habe hier ein ganz komisches Problem, das mich derzeit fast
> verzweifeln lᅵsst. Unter Linux kein Problem, unter Windows aber schon:
>
> Es sollte auf einen Rutsch eine komplette Datei eingelesen werden. Dazu
> wurde mit fread alles in einen Puffer eingelesen. Ich musste dann
> feststellen, dass im Gegensatz zu Linux die Datei nicht komplett
> eingelesen wurde, sondern nur exakt 261040 statt 282260 Zeichen.

Doch, sie wurde komplett eingelesen. Du hast nur ᅵbersehen, dass
Zeilenvorschᅵbe in Windows-Textdateien aus zwei Bytes (\r\n) bestehen,
in C aber nur aus einem Byte (\n). Beim Einlesen wird das entsprechend
konvertiert.

Beim Schreiben passiert dann genau das Gegenteil: Aus dem einen Byte in
C werden in der Datei zwei. Das kannst Du einfach prᅵfen, indem Du den
gelesenen Dateiinhalt mal in eine neue Textdatei schreibst und Dir
anschlieᅵend deren Grᅵᅵe anschaust.

Die gleiche Textdatei hat unter Linux natᅵrlich nur 261040 Zeichen, weil
der Zeilenvorschub bei Linux-Textdateien nur aus einem Byte besteht (\n).

> Was ist da falsch?

Gar nichts. Ist alles in bester Ordnung.

Gruᅵ
Claus

Burkhard Schultheis

unread,
Jul 30, 2012, 3:18:37 AM7/30/12
to
Ja, ihr habt alle Recht! Aber was ich nicht in Ordnung finde, ist die
Tatsache, dass unter Windows nach dem Dateiinhalt noch Schrott kommt:
Mein Puffer, der so groᅵ ist wie die Datei mit den CRs, wurde am Ende
mit Schrott aufgefᅵllt (er war vorher mit Nullen initialisiert). Auch,
wenn das nicht spezifiziert ist, finde ich es nicht gerade toll.

Grᅵᅵe
Burkhard

Edzard Egberts

unread,
Jul 30, 2012, 3:40:52 AM7/30/12
to
Burkhard Schultheis schrieb:
> Ja, ihr habt alle Recht! Aber was ich nicht in Ordnung finde, ist die
> Tatsache, dass unter Windows nach dem Dateiinhalt noch Schrott kommt:
> Mein Puffer, der so groᅵ ist wie die Datei mit den CRs, wurde am Ende
> mit Schrott aufgefᅵllt (er war vorher mit Nullen initialisiert). Auch,
> wenn das nicht spezifiziert ist, finde ich es nicht gerade toll.

Selber Schuld, Deine Routine zum Einlesen geht so nicht. Du liest ᅵber
"Filesize", die ᅵndert sich aber beim Einlesen durch den CR-Murks. Da
musst Du entweder unter beiden Systemen immer binᅵr lesen, oder unter
beiden System immer zeilenweise lesen. Mit C++ geschrieben kᅵnnte das
z.B. so aussehen:

#include <string>
#include <fstream>
#include <list>

using namespace std;

string Line;
list< string > Lines;

fstream In(Name.c_str(), ios_base::in);
while (In.good() && In.peek()!= EOF)
{
getline(In, Line);
if (In.good()) Lines.push_back(Line);
}
In.close();

Dieser Code wᅵrde sowohl unter Windows, als auch unter Linux funktionieren.

Burkhard Schultheis

unread,
Jul 30, 2012, 4:06:30 AM7/30/12
to
Ich habe es inzwischen so gelᅵst, dass ich einfach nach der Anzahl
gelesener Bytes ein Null-Byte schreibe. So bin ich zufrieden! ;-)

Grᅵᅵe
Burkhard
0 new messages