Zum Inhalt springen

Auslesen einer Datei


Cos

Empfohlene Beiträge

Hallo zusammen,

ich möchte gerne eine Datei namens Header.dat in der 44 Bytes enthalten sind in eine andere Datei schreiben. Diese Datei soll die 44 Bytes jedoch als pure Hexadezimalzahlen enthalten oder als Dezimal, das ist egal.

Kann mir jemand helfen?

Danke

Grüße

Cos

Link zu diesem Kommentar
Auf anderen Seiten teilen

1 Byte pro Zahl. Big und Little Endian variieren in dem Header, mal so und mal so. Kurz gesagt, ich möchte die Datei so in einer Textdatei stehen haben so wie sie auf der linken( bei den meisten Editoren) Seite, also Hexzahlen dargestellt werden.

Cos

Link zu diesem Kommentar
Auf anderen Seiten teilen

1 Byte pro Zahl. Big und Little Endian variieren in dem Header, mal so und mal so.
Wenn du jedes Byte einzeln in eine Hexzahl umwandeln willst, ist die Endianness ja egal ;)

Kurz gesagt, ich möchte die Datei so in einer Textdatei stehen haben so wie sie auf der linken( bei den meisten Editoren) Seite, also Hexzahlen dargestellt werden.
Ok, die Aufgabe ist klar. Wo ist das Problem?

Einlesen?

Umwandeln?

Schreiben?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist das ich in meiner Datei leider nur Ascii-Zeichen habe und keine Hex-Werte. Ich möchte die Ascii-Zeichen, zu je 4 Bytes oder 2 bytes in eine XML-Datei schreiben. aber ich bekomme sie einfach nicht umgewandelt.

zb: "V (sind 2 Leerzeichen hinten dran) = Hexadezimal 22 56 00 00 = Int 22050 "kHz". Verstehst du was ich meine...wie wandle ich das? Und warum macht mein XML-File bei einem Leerzeichen schlapp und lässt das wegfallen.

Grüße

Jens

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also es sieht folgendermaßen aus.

V (ascii) = 56

" (ascii) = 22, [das hattest du üebrsehen]

Leerzeichen nicht DAS Leerzeichen, sondern das was bei h00 kommt wenn man es im editor anschaut.

Daraus folgt 22 56 00 00 gelesen little endian, ergbit 22050.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denk mal, du willst das in etwa so machen und str dann wieder wegschreiben:

	char byte[4];
byte[0] = '\"';
byte[1] = 'V';
byte[2] = 0;
byte[3] = 0;

char str[10] = {'\0'};

int a = byte[3] * 0x1000000 + byte[2] * 0x10000 + byte[1] * 0x100 + byte[0];
_itoa(a, str, 10);

cout << str << endl;[/PHP]

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber mit deinem Code habe ich ja statische angaben zu den Chars.

Ich habe aber ein Array in dem die Daten stehen. Also muss ich was dynamisches haben.

In meinem Code wird nur ein einziger char umgewandelt. Es sollte nicht besonders schwierig sein, das in eine Schleife zu verpacken. Das Array hexdigits wird nicht umgewandelt, es dient nur als Lookup-Tabelle für die Zeichen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

hi ihr beiden seid meine helden...es klappt mit einer kleinen schleife die den Buffer jedesmal nullt und umbenennen des a in uint hats geklappt.

Aber wenn ich noch einmal was fragen darf. Woher kommt der fehler

Required white space was missing. Error processing resource 'file:///C:/Dokumente und Einstellungen/.../header.xml'. Line 3, Position 242

<RIFF value="RIFF"/><LengthOfFile value="486188

in der xml-datei? Der fehler kommt erst nach ein paar Daten die ich reingeschrieben habe. Seltsamerweise liest mir C++ die Daten richtig aus, nur die XML-Datei schreibst nicht...

Mein XML-Header ist:

XMLFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", 39);

XMLFile.write("<RiffWaveHeader>\n", 17);

Viele Grüße

Cos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich bin auf der Suche nach einem Befehl der eine Datei aus liest bis der string "data" erreicht ist und gleichzeitig einen Counter hochzählt. welchen Befehl gibt es da? Habe mit fread und gets probiert, aber es klappt nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Und genau das ist mein Gedächntnislücke...eine von vielen...:-) mit was checke ich das dann? Weil es sind ja vier Bytes die das Wort darstellen und es kann ja sein das nicht unbedingt das erste "d" was erscheint schon das von data ist. Muss ich dann vier tests machen. Quasi, wenn "d" dann checke ob nächstes byte "a"...etc.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo :)

jetzt funktioniert bei mir alles wunderbar in eine Richtung. Nun muss ich aber mal kurz fragen wie es in die andere geht.

mein xml file sieht so aus.

<?xml version="1.0" encoding="UTF-8" ?>

- <RiffWaveHeader>

<RIFF value="RIFF" />

<LengthOfFile value="6144036_byte" />

<WAVE value="WAVE" />

und nun möchte ich die Daten die in den Hochkommata ab RIFF Value stehen wieder in ASCII in eine Datei habe. quasi das was ich vorher gemacht habe rückgängig. Und wenn es geht ohne diese XML-Klassen mit Get.Attrib.Val() etc.

Geht das?

Grüße

Cos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Natuerlich kannst das ohne deine XML Klassen machen und dein File von Hand parsen, ich bezweifle jedoch, dass es dadurch einfacher wird ;) (Es sei denn du hast deine dezimalen Werte noch in irgendner Struktur gespeichert)

Ansonsten einfach rueckwaerts rechnen :)

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja das mit dem Rückwärtsrechnen ist so ne Sache. Mich interessiert ja nur die Zahl die in den Hochkommata steht. Wie bekomme ich die denn einzeln da raus? so das ich überhaupt rechnen kann. momentan kopiere ich alles inklusive dem RIFF value und dem XML header in die Datei.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

will jetzt nicht extra einen neuen thread öffnen.

was ist an der schleife hier falsch?


unsigned char str[1000];

	  for (;str[a] != '<' && str[a+1] != '/' && str[a+2] != 'R'; a++)

Wieso bricht die schleife ab, sobald str[a] !='v' erfüllt ist aber die anderen nicht?

Grüße

Cos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast in deinem Code kein str[a] !='v' stehen :D

...und abbrechen tuts schon beim ersten erfuellten, weil du die Bedingungen per UND verknuepft hast.

Sobald eine Bedingung falsch ist, wird der Ausdruck,welcher ueber UND verknuepft ist, falsch und die Schleife bricht ab.

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

nun geht die schleife und ich bin froh, aber

ich habe noch folgendes problem


//File Length auslesen

if (j == 0x41c && value == 0x21d)

{

for (unsigned int iii = 0; iii < a-(b+bb); iii++)

c = fgetc(file);

bb = 0;

for( ;c != '_'

{

b = a;

fprintf(head, "%c", c);	

c = fgetc(file);

bb++;					

}			

}

[/code]

Diese schleife gibt mir eine Zahl aus, die in dem unsigned char c gespeichert und dann in die Datei head geschrieben wird. c ist ein char da auch Buchstaben ausgegeben werden. Jetzt möchte ich die Zahl in Ascii haben und habe es mit _itoa probiert aber das wollte er nicht.

Wie müsste das denn aussehen?

_itoa(out,c,??) was denn für ein radix?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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