Datein einlesen
-
while (ifile.read (&c, sizeof(char))) { ofile.write (&c, sizeof(char)); }
-
Danke funktioniert jetzt super.
-
Ja, das funktioniert, ist aber laaaaaaaaaaaaahhhm.
Check this out:
#include <stdio.h> int copy_file( char* fname, char* cpyname ) { char buf[4096]; unsigned int bytes_read; int ret = 0; FILE *infile, *outfile; infile = fopen( fname, "rb" ); outfile = fopen( cpyname, "wb" ); if ( !infile || !outfile ) { perror("Open error"); return 1; } while( ! feof( infile ) ) { bytes_read = fread( buf, sizeof(char), sizeof(buf), infile ); if( ferror( infile ) ) { perror( "Read error" ); ret = 2; break; } if ( bytes_read != fwrite( buf, sizeof(char), bytes_read, outfile ) ) { perror( "Write error" ); ret = 3; break; } } fclose(infile); fclose(outfile); return ret; } int main() { char* p1 = "lesen"; char* p2 = "schreiben"; copy_file(p1,p2); return 0; }
MfG
Mr. H.
-
Ja, das ist wahrscheinlich schneller, aber das Problem läd alle Zeichen auf einmal ein und der Buffer hat nur Platz für 4096 Zeichen. Das ist für ne Textdatei wohl meistens genug, aber für ein Bild zum Beispiel ist es viel zu klein und solche riesen char-arrays zu machen ist Speicherverschwendung und der Zugriff darauf dürfte das Programm langsam machen.
-
4096 Byte sind Speicherplatzverschwendung ?
Hallo ?
Lebst du noch in der Steinzeit ?
Das sind nicht einmal 0,005 MByte.
-
wie bitte ? schrieb:
4096 Byte sind Speicherplatzverschwendung ?
Hallo ?
Lebst du noch in der Steinzeit ?
Das sind nicht einmal 0,005 MByte.Ja, mir ist klar das 4096 nciht viel ist. Was ich sagen wollte ist, dass du bei größeren Dateien ja noch mehr brauchst. Schon bei nem relativ kleinen Bild brauchst du an die 10^8 Bytes. Und ich denke, entweder du kannst es gar nicht erst erstellen, oder es braucht eine Unmenge an Zeit für den Zugriff.
-
vollkommen richtig, deshalb hab ich das so gelöst, allerdings werden hier nicht die Dateiattribute mitkopiert
long CopyData(string Input, string Output, long BufferSize) { char *Buffer; long DataSize = 0; long CopyStatus = 0; long MainBufferSize = 0; ifstream infile(Input.c_str(),ifstream::binary); if(infile.is_open() == false) return -1; ofstream outfile(Output.c_str(),ifstream::binary); if(outfile.is_open() == false) return -2; infile.seekg(0,ifstream::end); DataSize = infile.tellg(); infile.seekg(0, ifstream::beg); Buffer = new char[BufferSize]; MainBufferSize = BufferSize; /* Datei kopieren */ while(!infile.eof()) { /* Binärdaten auslesen */ CopyStatus += BufferSize; if(CopyStatus > DataSize) { MainBufferSize = BufferSize - (CopyStatus - DataSize); } else { MainBufferSize = BufferSize; } infile.read (Buffer, MainBufferSize); /* Binärdaten wieder schreiben */ outfile.write (Buffer, MainBufferSize); } /* Aufräumen */ delete[] Buffer; infile.close(); outfile.close(); return DataSize; }
Gruß Chris
-
@Foxx: Warum benutzt du ne Schleife, du liest doch eh alles in einem Rutsch ein.
-
Sorry, hab mich verguckt, ich dachte du machst den Puffer so groß wie die Dateigröße aber. Die Dateiattribute kannst du mit GetFileAttributes und SetFileAttribues aus der WinAPI kopieren.
-
Danke! Das hilft mir
Hatte genau diese Frage eben schon gestellt als Thread, danke für die Antwort !
Gruß Chris