zahlen auslesen, und in einem char speichern
-
Ich habe eine Datei mit mehreren zahlen, die ich in ein Array speichern möchte, aus platzgründen möchte ich diese Zahlen nun aber in einem char speichern. Wie kann ich die Datei so einlesen, dass er nicht 0 als Zeichen (also den ASCII wert davon) speichert, sondern 0 als Zahl.
-
Hallo
Du musst die Zahl halt in ein Zeichen casten.
chrische
-
mit casten allein kommst da nicht weiter, das musst du schon ordnungsgemäß umwandeln. entweder umständlich mittels streams oder altherkömmlich, indem du vorm casten einfach 48 draufaddierst (solang es sich um einzelne ziffern handelt).
-
itoa
bei mehrstelligen zahlen
bsp.
int i= 139; char c; char array[1000]; int iC=0; while(rest){ itoa(c,i%10); rest= i%10; array[iC++]; i-= i%10; i/= 10; }
-
lies es eben als ein Integer-Typ (short, int, long whatever) ein und kopier es dann in ein char.
BorisDieKlinge schrieb:
itoa
itoa gibt es nicht im Standard! Außerdem würde ihn das sicher nicht weiterbringen...
-
Krux schrieb:
Ich habe eine Datei mit mehreren zahlen, die ich in ein Array speichern möchte, aus platzgründen möchte ich diese Zahlen nun aber in einem char speichern. Wie kann ich die Datei so einlesen, dass er nicht 0 als Zeichen (also den ASCII wert davon) speichert, sondern 0 als Zahl.
Hallo,
Das ASCII-Zeichen 0 entspricht dem Wert 48. Du mußt nur von jedem Ziffernzeichen (0 bis 9) 48 abziehen und dann hast du den Zahlenwert.
-
Andromeda schrieb:
Krux schrieb:
Ich habe eine Datei mit mehreren zahlen, die ich in ein Array speichern möchte, aus platzgründen möchte ich diese Zahlen nun aber in einem char speichern. Wie kann ich die Datei so einlesen, dass er nicht 0 als Zeichen (also den ASCII wert davon) speichert, sondern 0 als Zahl.
Hallo,
Das ASCII-Zeichen 0 entspricht dem Wert 48. Du mußt nur von jedem Ziffernzeichen (0 bis 9) 48 abziehen und dann hast du den Zahlenwert.char c; // ... char zahl = c - '0';
-
rüdiger schrieb:
Andromeda schrieb:
Krux schrieb:
Ich habe eine Datei mit mehreren zahlen, die ich in ein Array speichern möchte, aus platzgründen möchte ich diese Zahlen nun aber in einem char speichern. Wie kann ich die Datei so einlesen, dass er nicht 0 als Zeichen (also den ASCII wert davon) speichert, sondern 0 als Zahl.
Hallo,
Das ASCII-Zeichen 0 entspricht dem Wert 48. Du mußt nur von jedem Ziffernzeichen (0 bis 9) 48 abziehen und dann hast du den Zahlenwert.char c; // ... char zahl = c - '0';Die Version ist nicht so toll, da hab ich nur noch die Ziffern von 0 bis 9, aber bei einer 255 macht der schlap, da ist die vorherige version schon besser, aber geht das nicht auf kosten der geschwindigkeit, wenn man immer erst alles in großen Daatentypen einliest, und dann umformt? Eigentlich ist ja C++ schon nicht schlecht, aber in solchen sachen, da haben andere sprachen schon ihre Vorteile...
-
Gehe mal davon aus, dass deine Zahlen so in der Datei stehen: 211 33 123 22 255 usw.
Speichern willst du in "unsigned char" Wertebereich 0 bis 255
Man kann sich dafür 'ne kleine Hilfsfunktion schreiben:#include <fstream> #include <string> #include <sstream> using namespace std; unsigned char convert(ifstream& ein) { string str; ein >> str; istringstream istr(str); int c; istr >> c; return static_cast<unsigned char>(c); } int main( ) { ifstream ein("c:\\zahlen.txt"); unsigned char tab[1000]; for (int i = 0; ein.good(); i++) tab[i] = convert(ein); }:xmas1:
-
Entschuldigung - die Hilfsfunktion ist unnötig und umständlich, machs so:
#include <fstream> using namespace std; int main( ) { ifstream ein("c:\\zahlen.txt"); unsigned char tab[1000]; int c; for (int i = 0; ein.good(); i++) { ein >> c; tab[i] = static_cast<unsigned int> (c); } }:xmas1:
-
Mein Vorschlag:
#include <iostream> #include <fstream> #include <algorithm> // copy #include <iterator> // istream_iterator #include <limits> #include <cassert> #include <vector> struct ByteIO { typedef unsigned char byte_type; operator byte_type() const { return m_byte; } friend std::istream& operator>>( std::istream& in, ByteIO& br ) { unsigned i; if( in >> i ) { assert( i <= std::numeric_limits< byte_type >::max() ); // bzw. Exception br.m_byte = static_cast< byte_type >( i ); } return in; } private: byte_type m_byte; }; int main() { using namespace std; vector< unsigned char > tab; ifstream datei( "input.txt" ); copy( istream_iterator< ByteIO >( datei ), istream_iterator< ByteIO >(), back_inserter( tab ) ); return 0; }Gruß Werner :xmas2: