2 zeichen aus datei lesen maniepulieren und in neue Datei schreiben
-
Hallo erst mal an alle,
hab grad ein kleines problem bei einen Programm welches ich schreibe...
Ich möchte eigentlich aus einer Datei zwei zeichen auslesen diese dann einzeln in ihren ascii code umwandeln und dann gemeinsammen in eine int variable schreiben, nun maniepuliere ich diesen noch (wie ist ja für das problem unintressant) und anschließend soll dieser wert wieder aufgesplitettet werden und in zwei ASCII zeichen umgewandelt werden und diese zwei zeichen sollen in eine neue datei geschrieben werden. anschliessend sollen die nächsten zwei zeichen herausgelessen werden und das ganze fängt wieder von vorne an.
Des weiteren muss, falls das erste zeichen einen ascii code hat der kleiner als 99 ist noch eine null vorangestellt werden. Damit ich genau weiss wo das erste zeichen begint und endet.
Mal an einen Beispiel:
In der Datei steht beispielsweise:
(HALLO)ich lese die ersten zwei zeichen aus:
(Hnun wandel ich diesen in ihren ascii code um
( --> 040
H --> 072nun werden diese zwei werte in eine int variable geschrieben:
i = 040072
jetzt maniepuliere ich das ganze:
i = i+1 //Beispieklsweise
jetzt ist i = 40073
daraus muss ich jetzt die zwei int 040 und 073 rauskriegen und diese wandel ich dann wieder in die zwei zeichen (I und dass soll in eine neue datei geschrieben werden.
Sitz jetzt schon eine weile an den problem aber ich krieg es irgendwie nicht hin. Hoffe mir kann einer helfen schon mal vielen dank.
-
Ich lese überall nur "umwandeln", aber ich sehe nirgendwo etwas, was umgewandelt werden müsste. Zeichen (chars) sind Zahlen! Da gibt es nichts umzuwandeln. Sie sind bereits ihr ASCII-Wert (zumindest wenn die Codierung ASCII sein sollte), damit kann man ganz normal rechnen. Das einzige was chars von anderen Zahlendatentypen unterscheidet, ist, dass es für sie einen speziellen Ausgabemodus gibt, bei dem ihr Zahlenwert als ein passendes Zeichen aufgefasst wird. Wenn du das nicht möchtest, dann nimm eben einen Zahlenformatspezifizierer bei printf. Und wenn du dir nun noch die ganzen Optionen für die Formatspezifizierer anguckst:
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
Dann findest du bestimmt auch ganz schnell die Kombination, wie man Zahlen bei der Ausgabe auf eine feste Länge erweitert und wie man macht, dass das Erweitern mit vorangestellten Nullen statt mit Leerzeichen erfolgt.P.S.: Hier noch etwas "Inspiration" (eigentlich schon die Lösung):
#include <stdio.h> int main(){ char a = 'A'; printf ("Das Zeichen '%c' hat Wert %i\n", a, a); printf ("Das Zeichen '%c' hat Wert %i\n", a + 1, a + 1); printf ("Die Zahl %i mit Nullen vorne dran: %03i\n", 3, 3); }
-
schon mal danke das ist auch nicht so das problem gewesen, das liegt bei mir eher darin genau 2 zeichen aus einer datei zu lesen und diese dann als einen int wert zu hinterlegen und diesen dan wieder auseinander zu nehmen
-
franziska1988 schrieb:
schon mal danke das ist auch nicht so das problem gewesen, das liegt bei mir eher darin genau 2 zeichen aus einer datei zu lesen und diese dann als einen int wert zu hinterlegen und diesen dan wieder auseinander zu nehmen
Und genau das musst du gar nicht tun! Wenn du zwei Zeichen liest, dann sind die beiden schon Zahlen. Mit chars kannst du rechnen wie mit int, der einzige Unterschied ist der kleinere Wertebereich. Wenn du einen größeren Wertebereich für deine Rechnung benötigst, dann weise die chars für die Rechnung einem int zu. Stell dir einfach vor, chars wären wie shorts, nur noch kleiner.
edit: Ach du meinst, du willst die beide in einen int packen? Ja, das ist natürlich möglich, du musst nur sagen, auf welche Weise du dir das vorstellst. Meinst du vielleicht so:
int zusammen = char1 << CHAR_BIT + char2;
?
-
ok ich glaub wir reden aneinander vorbei das ich mit char ganz normal rechnen kann ist mir bewusst aber ich muss die beiden char zu einen verbinden und das ist mein problem das ich das nicht hinkriege:( und das nächste problem ist das ich es nicht hinkriege genau 2 zeichen aus ein datei auszulesen
-
ok also in etwas das hab ich vor:
zeichenkette: ABCDEFGHI
ich nehme zwei char
AB ->065066 welches den int 65066 ergibt denn will ich dan beispielsweise + 40 rechnen welches 065114 ergibt und jetzt will ich wieder 2 zeichen rauskriegen also A und r ergibt und dann sollen die nächsten zwei zeichen ausgelesen werden und wieder maniepuliert werden brauch das für ein verschlüsselungsprogramm
-
franziska1988 schrieb:
ound das nächste problem ist das ich es nicht hinkriege genau 2 zeichen aus ein datei auszulesen
Wie wärs mit zweimal fgetc() ?
so etwa?
int zeichen, zeichen, zeichen2; FILE *fp; .... // Datei öffnen und dgl. .... zeichen1 = fgetc(fp); zeichen2 = fgetc(fp); zeichen = zeichen1 * 256 + zeichen2; // oder * 1000, musst du wissen printf("Komtrolle %d , %d -> %d\n", zeichen1, zeichen2, zeichen); zeichen = zeichen + 1; zeichen2 = zeichen % 256; // oder % 1000 zeichen1 = zeichen / 256; // oder / 1000 printf("Komtrolle %d , %d -> %d\n", zeichen1, zeichen2, zeichen);
Das geht auch anders.
-
Tut das Not, ausgerechnet im Zehnersystem zu rechnen? Wie auch immer, die oben gezeigte Rechnung geht analog, bloß muss man eben um 3 Zehnerstellen shiften (also mit 1000 multiplizieren), anstatt um CHAR_BIT Binärstellen. Und Rückgängig macht man das ganze eben rückwärts: 1000er Rest angucken für den rechten Teil und 1000er Division angucken für den linken Teil. Wenn du ganz elegant sein möchtest, gibt es auch noch die Funktion div aus der Standardbibliothek, die beides gleichzeitig ausrechnet.
-
ok ich brauch mal ne minuten zum ausprobieren^^ gib mir 4 bis 5 minuten
-
Ok das ist supi es klappt hab allerdings noch ein problem, ich will jetzt ne schleife um das gesamte teil bauhen, damit das ganze bis zum ende der Datei durchlaufen wird kannst du mir noch sagen wie das aussehen müsste?
-
while ((char1 = fgetc(datei)) != EOF && (char2 = fgetc(datei)) != EOF) ...
-
franziska1988 schrieb:
genau 2 zeichen aus einer datei zu lesen und diese dann als einen int wert zu hinterlegen und diesen dan wieder auseinander zu nehmen
Dann lies doch auch gleich 1x 2 Zeichen und nicht 2x 1 Zeichen.
Du kannst als Datentyp unsigned short, wchar_t oder evtl. auch noch union nehmen. (das spart die Bitfrickelei)