Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben
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).

Geschrieben

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!

Geschrieben

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.

Geschrieben

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

Geschrieben

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;

Geschrieben

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.

Geschrieben

@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.

Geschrieben

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 :D

Hoffe jmd. hat noch Bock, mir das (noch) genauer zu erklären.

Danke im vorraus

KarlBerg

Geschrieben
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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...