Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Letztes Zeichen wird beim binären Schreiben verdoppelt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.03.2005, 16:51 Uhr
~Gast
Gast


Hallo,
ich sitze nun schon ne ganze Weile an dem folgenden Problem. Ich möchte einfach nur ne Datei binär einlesen und diese danach wieder binär schreiben. Lesen und Schreiben geht auch soweit, nur wird das letzte Zeichen doppelt ausgegeben. Hat jemand ne Erklärung warum das so ist?


C++:
FILE *in, *out;
if ((in = fopen("c:\\boot.ini", "rb"))== NULL)
return;

if((out = fopen("c:\\boot.txt", "wb"))== NULL)
return;

char aChar[1];

while (!feof(in))
{
fread(aChar,1,1,in);
fwrite(aChar,1,1,out);
}

fclose(in);
fclose(out);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.03.2005, 17:12 Uhr
Tommix



Hallo,
feof wird erst gesetzt, nachdem versucht wurde hinter dem Dateiende zu lesen. Du kannst zum Beispiel dies machen:

C++:
...
while (!feof(in))
{
if fread(aChar,1,1,in);
    fwrite(aChar,1,1,out);
}
...



- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.03.2005, 17:16 Uhr
Pablo
Supertux
(Operator)


Auch nicht Tommix


C++:
...
while (!feof(in))
{
if (fread(aChar,1,1,in)) /* kein ; hier und Ausdruck im Klammern */
    fwrite(aChar,1,1,out);
}
...


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.03.2005, 17:18 Uhr
typecast
aka loddab
(Operator)


Der Grund dafuer ist der, dass feof erst dann true zurueck gibt, nachdem du versucht hast ueber das ende der Datei herauszulesen.

Im letzten Schritt zeigt der Filepointer auf das Ende der Datei. feof gibt also 0 zurueck und es geht in die Schleife.
Wenn dann jetzt fread aufgerufen wird, dann schlaegt die Leseoperation fehl. In aChar befindet sich dann das zuletzt gelesene Zeichen, dass dann nochmal in die Datei geschrieben wird.

Dann haette ich noch eine Anmerkung:


C++:
char aChar[1];



sieht ein wenig komisch aus (aber es ist nicht falsch )

Ich wuerde es so machen:


C++:
        char aChar;
        fread(&aChar,1,1,in);
        while (!feof(in))
                {
                        fwrite(&aChar,1,1,out);
                        fread(&aChar,1,1,in);
                }


--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 02.03.2005 um 17:19 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.03.2005, 17:19 Uhr
typecast
aka loddab
(Operator)


Huch. Da hab ich aber lange zum schreiben gebraucht
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2005, 17:25 Uhr
Pablo
Supertux
(Operator)



Zitat von typecast:
Ich wuerde es so machen:


C++:
        char aChar;
        fread(&aChar,1,1,in);
        while (!feof(in))
                {
                        fwrite(&aChar,1,1,out);
                        fread(&aChar,1,1,in);
                }




Das hilft natürlich, aber ich würde trotzdem bei fwrite und fread immer überprüfen, was sie zurückgeben.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.03.2005, 17:28 Uhr
typecast
aka loddab
(Operator)


Jo. Rueckgabewerte zu ueberpruefen ist immer eine gute Idee
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 02.03.2005 um 17:29 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.03.2005, 08:12 Uhr
~Gast
Gast


Vielen Dank!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: