Fwrite und die formatierung

hallo zusammen,

habe eine frage, die mir 3 bücher nicht beantworten konnten, obwohl sie gar nicht so schwer ist. es geht um folgendes:

eine datenstruktur, die angelegt wurde wie folgt:

struct daten{
char titel[30];
char interpret[30];
int dauer;
}

struct daten musikDB[100];

danach wird eine textdatei geöffnet, in welche diese daten geschrieben werden sollen. das klappt auch recht gut, was die ersten beiden teile titel und interpret angeht. leider gibt jedoch fwrite die integers nicht korrekt aus oder in einem anderen format. statt zahlen gibts kryptische zeichen in der datei.

kann mir jemand sagen, ob fwrite vielleicht gar nichts mit integers anfangen kann und nur chars haben möchte? wie kann ichs sonst lösen, sodass fread die daten brav wieder einliest? (die dauer in integers anzugeben ist bestandteil der aufgabe!)

vielen dank an dieser stelle!!!

gruß,
tommy

Hi Tommy,

fwrite() ist eine binary-write function. Die schreibt einfach die Daten aus dem Speicher in eine Datei. Dabei werden keine Formatierungen vorgenommen sondern einfach byte für byte vom Speicher in Datei geschrieben.

Wenn Du die Integers auch als text in der Datei haben willst, kommst Du um eine Umwandlung zuvor nicht drumherum. (bspw. mit printf() )

vielen dank für deine antwort!

bedeutet das, dass ich das besser mit fprintf() lösen sollte? oder aber die integers in chars umwandeln muss?

also entweder

fprintf(dateizeiger, „%d“, musikDB[i].dauer);
(in einer schleife)

oder die dauer in der struktur als char deklarieren.

so?

gruß,
tommy

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Tommy,

bedeutet das, dass ich das besser mit fprintf() lösen sollte?

Ja.

oder aber die integers in chars umwandeln muss?
oder die dauer in der struktur als char deklarieren.

Beide nein, macht die fprintf().

struct daten musikDB[100];
int i;
for (i=0; iDie Ausgabe wäre dann z.B.:
YellowSubmarine TheBeatles 4

Würde ich so machen. So kann ich es mir auch aussuchen, welche Daten reinkommen, und welche nicht. Einlesen kannst Du das dann mit der fscanf() zeilenweise, die Wörter mit strtok() o.Ä. auftrennen, oder man liest eben bis zum nächsten Leerzeichen, ev. einen Beistrich dazwischen.

Wenn noch was unklar ist, schreib nur wieder!
lg
Martin B

Hallo Tommy,

Das mit der 6 ist natürlich Unsinn. Eine positive int kann ja nicht mehr als 5 Zeichen haben, und es bringt auch gar nichts für diesen Zweck:

int i;
for (i=0; iFalls Du "The Beatles" so schreiben willst, halte ich ein Trennzeichen für nötig.
lg
Martin B

Hallo Martin,

Das mit der 6 ist natürlich Unsinn. Eine positive int kann ja
nicht mehr als 5 Zeichen haben, und es bringt auch gar nichts
für diesen Zweck:

Das ist aber ein unzulässige Annahme !

Es ist in keiner Norm festgelegt, wieviele Bits ein int haben muss.
Diese Angaben findest du unter den Implementierungs-Details des Compilers.
Aktuell musst du, in den meisten Fällen, bei int mit 16 oder 32 Bit Länge rechnen.

MfG Peter(TOO)

Hallo Peter,

Das mit der 6 ist natürlich Unsinn. Eine positive int kann ja
nicht mehr als 5 Zeichen haben, und es bringt auch gar nichts
für diesen Zweck:

Das ist aber ein unzulässige Annahme !

Es ist in keiner Norm festgelegt, wieviele Bits ein int haben
muss.
Diese Angaben findest du unter den Implementierungs-Details
des Compilers.
Aktuell musst du, in den meisten Fällen, bei int mit 16 oder
32 Bit Länge rechnen.

Danke für den Tipp. Gleiches gilt ja auch für andere Datentypen.
Dieses hier

cout ergibt auf WIN2K / VC6 nach meiner Erfahrung 4 Bytes, das hat wohl mit der 32-Bit Speicher-Verwaltung zutun.

Ich meinte das nun aber so: eine int, die -32768 bis 32767 haben kann, wird als Zeichenkette maximal 5 Zeichen (in der Textdatei) aufweisen, plus eine für das etwaige Minus. Vielleicht kann ich da mit Deiner Zustimmung rechnen.

lg
Martin B