KarlBerg Geschrieben 5. März 2002 Geschrieben 5. März 2002 Hi, hat hier jmd. ne Ahnung, wie ich eine Datei binär in drei Teile splitten kann? Ich gebe z.B. an, dass der 1. Teil 1000 Byte gross sein soll, der 2. Teil 5000 Byte und der 3. Teil, soll den Rest enthalten. Dann soll jeweils eine Datei erstellt werden, mit dem Inhalt der ersten 1000 Byte, usw... Komme eher aus der VB-Schiene, da stellt das ganze kein so grosses Problem da. Hoffe in C/C++ ist das nicht anders. Wäre nett wenn mir jmd. weiterhelfen könnte. MfG KarlBerg (BTW: Für Borland C++, kein Visual Studio, Abschnittsgrössen können ruhig fest eingebunden werden.) Zitieren
gajUli Geschrieben 5. März 2002 Geschrieben 5. März 2002 zaehler = 0 file-handles oeffnen solange zaehler < 1000 zaehler hoch byte lesen und in datei1 schreiben solange zaehler < 5000 zaehler hoch byte lesen und in datei 2 schreiben bis ende in datei 3 schreiben file-handles schliessen Zitieren
gugelhupf Geschrieben 6. März 2002 Geschrieben 6. März 2002 hmmmm, da fällt mir ein: warum reden alle immer von "binär" öffnen ?? was wäre denn das gegenteil ??? *nixkapier* eine datei besteht IMMER aus binären informationen ?! oder wie etz ? Zitieren
Klotzkopp Geschrieben 6. März 2002 Geschrieben 6. März 2002 Original geschrieben von gugelhupf warum reden alle immer von "binär" öffnen ?? was wäre denn das gegenteil ??? Jede Datei lässt sich binär öffnen, aber bei manchen Dateien macht es mehr Sinn, sie im Textmodus zu öffnen. Da gibt es dann einige Besonderheiten, die den Umgang mit der Datei vereinfachen, z.B. Einlesen bis zum Zeilenende, ggf. automatisches Umwandeln der Zeilenende-Zeichen (CR/LF) sowie einen besonderen Code für das Dateiende (ASCII 26 = Strg-Z). Zitieren
Crush Geschrieben 6. März 2002 Geschrieben 6. März 2002 Man kann Files in Binary- oder Text-mode öffnen. Binary macht genau daß, worauf die meisten standardmäßig abzielen - Dateien zum byteweisen Zugriff öffnen. Im Text-Mode wird die Datei dann z.B. als Unicode-Stream oder Multibyte-Character-Stream geöffnet, also nicht wie üblich byteweise eingelesen, und dazu noch Character-Konvertierungen vorgenommen (zum Beispiel für Carriage-Return). Das geht weit über ein rohes binäres Lesen hinaus. Für diese Zugriffe gibt es die fw-Befehle (fwprintf, fwscanf, fgetwc, fputwc, fgetws, fputws). Mit int _setmode ( int handle, int mode ); kann man den Zugriff während des offenen Filehandles umschalten. Der Default Mode beim Dateiöffnen ist der Text-Mode! Zitieren
gugelhupf Geschrieben 6. März 2002 Geschrieben 6. März 2002 Danke ! Aber trotzdem liegt die Datei binär vor *gggg* Es geht ja nur darum welche "Lesesequenzen" angewandt werden. Ich wollt eigentlich nur darauf hinweisen, dass man in ein paar Threads von binär und text-dateien redet, als ob das einen "physischen" unterschied machen würde. Zitieren
KarlBerg Geschrieben 6. März 2002 Autor Geschrieben 6. März 2002 Hi, erstmal danke für die Antwort. Das dumme ist nur, dass ich gar net weiss, wie ich ne Datei zum binären Lesen öffne und wie ich den ausgelesenen Inhalt dann wieder wegschreiben kann Wäre nett, wenn jmd. ein Bsp. posten könnte, wie ich 1000 Byte einlese und wegschreibe. Das einzelne zusammensuchen der restlichen Teile mach ich dann selbst. Danke KarlBerg Zitieren
Crush Geschrieben 6. März 2002 Geschrieben 6. März 2002 Ich hab´s vielleicht nicht ganz sauber gemacht, aber so funkt´s auf jeden Fall: CFile input,output; input.Open("c:\\tmp\\out2",CFile::modeRead|CFile::typeBinary); int outl1=1000, outl2=5000; int size=input.GetLength(); char* lpbuf=new char[size]; char* lpbuf2=lpbuf; input.ReadHuge(lpbuf,size); input.Close(); output.Open("c:\\tmp\\out1",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); if (size>=outl1) { output.Write(lpbuf,outl1); lpbuf+=outl1; size-=outl1; } else { output.Write(lpbuf,size); lpbuf+=size; size=0; } output.Close(); output.Open("c:\\tmp\\out2",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); if (size>=outl2) { output.Write(lpbuf,outl2); lpbuf+=outl2; size-=outl2; } else { output.Write(lpbuf,size); lpbuf+=size; size=0; } output.Close(); if (size) { output.Open("c:\\tmp\\out3",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); output.Write(lpbuf,size); output.Close(); } delete[] lpbuf2; Zitieren
gajUli Geschrieben 6. März 2002 Geschrieben 6. März 2002 Nochmal zu Binaerdateien. Vor allem gibt es die doch, um darin Binaerobjekte zu speichern, die viel groesser als einzelen Bytes sind, beispielsweise ein Array von Structs. Da sagt man einfach in einer Funktion "woher, wieviele, wie gross, wohin" und kann die dann genauso wieder einlesen. Mit ASCII-Dateien waere das wohl ungleich umstaendlicher. Zitieren
TingleTangle Geschrieben 6. März 2002 Geschrieben 6. März 2002 @Gugelhupf Aber trotzdem liegt die Datei binär vor *gggg* Es geht ja nur darum welche "Lesesequenzen" angewandt werden. Ich wollt eigentlich nur darauf hinweisen, dass man in ein paar Threads von binär und text-dateien redet, als ob das einen "physischen" unterschied machen würde. Das muss man mit Vorsicht geniessen. Das du immer Bytes auf die Platte buegelst mag schon sein. Aber das heisst nicht, dass diese auch so abgelegt werden, wie du Sie schreibst. Man muss hier zum Beispiel eine Unterscheidung zwischen Little- und Big-Endian machen; es macht nämlich einen grossen Unterschied ob das MSB oder das LSB zuerst kommt, wenn du binaer ausliest. Im Text-Mode wird das für dich gehandelt, egal auf welcher Maschine du den Code übersetzt. Zitieren
KarlBerg Geschrieben 6. März 2002 Autor Geschrieben 6. März 2002 Danke Crush Da hast'e dir ja ne Menge Arbeit gemacht. SeltsamerDings läuft's bei mir net. Ich hab den Code (ohne Änderung) in ne Datei kopiert mit der Endung ".c". Dann wollte ich's mit "gcc für Win32" (http://agnes.dida.physik.uni-essen.de/~janjaap/mingw32/download.html) kompilieren. Das ist dabei rausgekommen C:\gcc\bin>gcc split.c -o split.exe split.c:1: parse error before `input' split.c:1: warning: data definition has no type or storage class split.c:3: parse error before `.' split.c:5: request for member `GetLength' in something not a structure or union split.c:6: `new' undeclared here (not in a function) split.c:6: parse error before `char' split.c:7: initializer element is not constant split.c:8: parse error before `.' split.c:23: redefinition of `size' split.c:5: `size' previously defined here split.c:23: warning: data definition has no type or storage class split.c:24: parse error before `}' split.c:39: redefinition of `size' split.c:23: `size' previously defined here split.c:39: warning: data definition has no type or storage class split.c:40: parse error before `}' split.c:51: parse error before `lpbuf2' split.c:51: conflicting types for `lpbuf2' split.c:7: previous declaration of `lpbuf2' split.c:51: warning: data definition has no type or storage class Muss Anfangs net noch was mit #include<...> und void main{}, oder so stehen. Bist wahrscheinlich davon ausgegangen, dass ich das selbst hinbekomme... da haste dich geirrt Hoffe jmd. hat noch Bock, mir das (noch) genauer zu erklären. Danke im vorraus KarlBerg Zitieren
Ketzer Geschrieben 6. März 2002 Geschrieben 6. März 2002 Original geschrieben von DocNeo Man muss hier zum Beispiel eine Unterscheidung zwischen Little- und Big-Endian machen; es macht nämlich einen grossen Unterschied ob das MSB oder das LSB zuerst kommt, wenn du binaer ausliest. Im Text-Mode wird das für dich gehandelt, egal auf welcher Maschine du den Code übersetzt. Generell sollte ich wissen was ich lese. Ob die Kiste nun mit Little- oder Big-Endian arbeitet kann mir doch eigendlich egal sein, es bleibt der gleiche Datentyp, der auf unterschiedlichen Maschinen zwar anders definiert ist, letztendlich aber vom Handling her gleich ist. Aufpassen muss ich nur wenn ich Daten in Dateiformspeichere und dann auf einem anderen System wieder einlese. Oder habe ich das jetzt falsch verstanden? Gruß Ketzer Zitieren
Crush Geschrieben 6. März 2002 Geschrieben 6. März 2002 Das ist die MFC-Variante und die benötigt von M$: #include <afx.h> Es geht in C auch über <stdio.h> ich hänge einfach mal einen kleinen Beispiel-Source für stdio an und dann mußt Du halt noch das ganze umschreiben (dazu habe ich keine Lust mehr). #include <stdio.h> #include <stdlib.h> void main( void ) { FILE *stream; char buffer[81]; int i, ch; /* Open file to read line from: */ if( (stream = fopen( "fgetc.c", "r" )) == NULL ) exit( 0 ); /* Read in first 80 characters and place them in "buffer": */ ch = fgetc( stream ); for( i=0; (i < 80 ) && ( feof( stream ) == 0 ); i++ ) { buffer = (char)ch; ch = fgetc( stream ); } /* Add null to end string */ buffer = '\0'; printf( "%s\n", buffer ); fclose( stream ); } Mit int fputc( int c, FILE *stream ); kann man einzelne Characters in den Stream schreiben und mit int int fgetc( FILE *stream ); lesen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.