Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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 ?

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

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!

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.

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

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;

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.

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

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

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

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.