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:
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!
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.
> 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.
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.
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.
> 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).
>> 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.
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.
> 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:
> 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: