Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dezimal aus Datei lesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.02.2009, 17:41 Uhr
~genie32
Gast


Also mir ist es egal ob es C oder C++ ist.

Ich will aus einer Datei, die in Hex geschrieben ist Dezimalzahlen auslesen. Die Datei ist so aufgebaut:
01 00 1A 00 A3 00 01 01 DA BC

Es werden immer Zwei Hexwerte zusammen genommen und der hintere wird vor dem anderen gestellt (ist leider so):

00 01 = 1
00 1A = 26
00 A3 = 163
01 01 = 257
BC DA = 48346

Wie ich eine Datei öffnen kann ist mir klar, aber wie lese ich in Dezimal aus?

Ich danke schon im vorraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.02.2009, 17:45 Uhr
~genie32
Gast


Ach ich arbeite mit stdio.h also mit fopen(...).
Wenns geht bitte das nutzen.
Aber andere Lösungen sind auch ok.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.02.2009, 23:19 Uhr
~genie32
Gast


Ich habe es fast geschaft. Mit vielen Hex geht es, aber bei dem Hex 0A geht es nicht. Wenn ich es mit getc(...) auslese müsste "10 '/010'" Darstehen stattdessen steht das da:
"-1 'Ÿ'" Kann mir das einer erklären, und wie kann ich das umgehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.02.2009, 23:44 Uhr
Kest
saint


Hi!

???

C++:
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>


int main()
{
    std::ifstream file("datei.txt");
    if(file){
       std::string s1, s2;
       int d = 0;
       std::stringstream oss;
       oss << std::hex;
       while(file >> s1 >> s2){
             s2.append(s1);
             oss.str(s2);
             oss >> d;
             oss.clear();
             std::cout << d << std::endl;
       }
    }
}



???

C++:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int main(void)
{
    FILE *file = fopen("datei.txt", "r");
    if(file){
        char s1[3] = {0}, s2[5] = {0};
        long d = 0;
        while(fscanf(file, "%s %s", s1, s2) != EOF){
              strncat(s2, s1, 2);
              d = strtol(s2, NULL, 16);
              printf("%d\n", d);
        }
       fclose(file);
    }
    
    return 0;
}


--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 16.02.2009 um 23:57 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.02.2009, 00:01 Uhr
0xdeadbeef
Gott
(Operator)


Das ist aber schon ein bisschen Overkill. Ich ginge da etwa so heran:

C++:
#include <fstream>
#include <iostream>

int main() {
  std::ifstream in("datei.txt");
  int ubyte, lbyte, x;

  in.setf(std::ios::hex, std::ios::basefield);

  while(in >> lbyte >> ubyte) {
    x = lbyte | ubyte << 8;

    std::cout << x << std::endl;
  }
}


In C halt analog mit while(fscanf(fd, "%x %x", &lbyte, &ubyte) == 2)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 17.02.2009 um 00:11 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.02.2009, 15:58 Uhr
~genie32
Gast


Hi,

also habe den Fehler in meinen Code gefunden. Ich habe vergessen bei fopen(...) ein b für binär hinzusetzten. Deshalb hat er immer mein 0x10 falsch übersetzt.
Danke für die hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.02.2009, 17:23 Uhr
Kest
saint


Irgendwie bin ich davon ausgegangen, dass er es so haben wollte.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.02.2009, 23:37 Uhr
Hans
Library Walker
(Operator)


Hi,

ist ja interessant, was Ihr da für Lösungen anbietet. Ich hätte das noch anders gemacht, nämlich mit 'ner union die ein int-Element und ein gleich langes char-array enthält. Hab aber nix geschrieben, weil ich es auch 'ne Art Overkill gehalten hab, die ich mir schenken wollte.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.02.2009, 03:42 Uhr
0xdeadbeef
Gott
(Operator)


Das Problem damit ist mehr, dass es nur auf little-endian-Architekturen funktioniert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.02.2009, 16:23 Uhr
Hans
Library Walker
(Operator)


Hi,

wieso das denn? - Es ist zwar nicht portabel, sollte aber trotzdem gehen. Er hat doch da 16-Bit-Daten, die in ein anderes integer-Format gebracht werden sollen, weil das Programm bzw. die Programmiersprache standardmässig mit grösseren Integern arbeitet.
Wenn man die Bytes als unsigned char einliesst, ist doch im wesetlichen die Frage, in welcher Reihenfolge man sie in das Array schreibt, um sie für little- oder big-Endian richtig darin stehen zu haben. Ein Problem wäre dann höchstens noch die Vorzeichenerweiterung bei negativen Zahlen. Aber das dürfte auch relativ schnell lösbarbar sein. - Ich hab allerdings keinen Rechner, der mit einem "Big-Endian-Prozessor" arbeitet, deshalb kann ich nicht testen, ob das auch stimmt, was ich da behaupte. - Aber von der Theorie her müsste es das.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: