Morsecode in map speichern und text in morsecode ausgeben
hallo leute,
ich komme irgendwie nicht weiter. kann mir vielleicht jemand helfen?
ich will mein text als morsecode ausgeben, aber nur mein erster buchstabe wird in morsecode ausgegeben.
vielen dank schonmal im voraus.
Morse.txt
...
P . - - .
O - - -
A . -
B - . . .
N - .
M - -
C - . - .
D - . .
L . - . .
K - . -
E .
F . . - .
...
ich komme irgendwie nicht weiter. kann mir vielleicht jemand helfen?
ich will mein text als morsecode ausgeben, aber nur mein erster buchstabe wird in morsecode ausgegeben.
vielen dank schonmal im voraus.
#include <iostream>
#include <map>
#include <fstream>
#include <string>
using namespace std;
int main() {
map<char, string> myMap;
ifstream datei("Morse.txt");
string str;
//string code;
char zeichensatz;
string text = "HALLO LEUTE";
while (getline(datei, str)) {
zeichensatz = str.at(0);
str.erase(0, 2);
//code = str;
myMap.insert(pair<char, string>(zeichensatz, str));
}
for (int i = 0; i < text.size(); i++) {
if(text.at(i) >= 'A' && text.at(i)<= 'Z') {
cout << myMap.find(text.at(i))->second << " ";
}
}
datei.close();
return 0;
}
Morse.txt
...
P . - - .
O - - -
A . -
B - . . .
N - .
M - -
C - . - .
D - . .
L . - . .
K - . -
E .
F . . - .
...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 344276
Url: https://administrator.de/forum/morsecode-in-map-speichern-und-text-in-morsecode-ausgeben-344276.html
Ausgedruckt am: 02.02.2025 um 10:02 Uhr
13 Kommentare
Neuester Kommentar
Servus,
es wäre weitaus übersichtlicher, wenn du deinen Code in die dafür vorgesehene Formatierung (Tags </> am linken Rand des Editors) bringst.
Außerdem scheint deine Shift-Taste defekt zu sein...
Weiterhin gibt es in der Glaskugel einige Lösungen dazu...
es wäre weitaus übersichtlicher, wenn du deinen Code in die dafür vorgesehene Formatierung (Tags </> am linken Rand des Editors) bringst.
Außerdem scheint deine Shift-Taste defekt zu sein...
hier
steht
dein Code
Weiterhin gibt es in der Glaskugel einige Lösungen dazu...
Abgesehen von der unnötigen Variable
Morse.txt
Zeile 55 hat hier übrigens die Bewandtnis Leerzeichen zwischen den Worten zu handhaben. Außerdem habe ich mich auf ASCII Zeichen beschränkt.
Grüße
rubberman
code
und dem -second
statt ->second
sehe ich keinen Grund warum dein Code nicht funktionieren sollte. Ich hätte es etwas anders geschrieben, aber das nur nebenher ...#include <iostream>
#include <map>
#include <fstream>
#include <string>
#include <algorithm>
int main() {
const std::string text = "HALLO LEUTE";
std::map<char, std::string> dictionary;
std::string line;
for (std::ifstream file("Morse.txt"); std::getline(file, line); dictionary.emplace(line.front(), line.substr(2u)));
std::for_each(text.cbegin(), text.cend(), [dictionary](const auto& character) {
auto it = dictionary.find(character);
if (it != dictionary.end()) std::cout << it->second << " ";
});
std::cout << std::endl;
}
Morse.txt
A .-
B -...
C -.-.
D -..
E .
F ..-.
G --.
H ....
I ..
J .---
K -.-
L .-..
M --
N -.
O ---
P .--.
Q --.-
R .-.
S ...
T -
U ..-
V ...-
W .--
X -..-
Y -.--
Z --..
0 -----
1 .----
2 ..---
3 ...--
4 ....-
5 .....
6 -....
7 --...
8 ---..
9 ----.
. .-.-.-
, --..--
: ---...
; -.-.-.
? ..--..
- -....-
_ ..--.-
( -.--.
) -.--.-
' .----.
" .-..-.
= -...-
+ .-.-.
/ -..-.
@ .--.-.
! -.-.--
& .-...
$ ...-..-
Grüße
rubberman
std::endl fügt nicht nur einen Zeilenumbruch an, es flusht auch den Ausgabepuffer und sorgt somit dafür, dass gepufferte und noch nicht geschriebene Zeichen geschrieben werden. Hänge mal statt std::endl ein std::flush an.
Das Verhalten des Programms ist trotzdem merkwürdig. Wie deinem Screenshot zu entnehmen ist, hilft das Flushing in der letzten Zeile nicht um die gesamte Ausgabe zu schreiben. Das sollte so aber keinesfalls sein. Irgendwie macht entweder deine IDE oder dein Betriebssystem hier was sehr merkwürdiges.
Grüße
rubberman
Das Verhalten des Programms ist trotzdem merkwürdig. Wie deinem Screenshot zu entnehmen ist, hilft das Flushing in der letzten Zeile nicht um die gesamte Ausgabe zu schreiben. Das sollte so aber keinesfalls sein. Irgendwie macht entweder deine IDE oder dein Betriebssystem hier was sehr merkwürdiges.
Grüße
rubberman
Mit oder ohne flush habe ich unter Windows keine Probleme. Hast du das Programm mal aus einer Shell aufgerufen, statt in der Console deiner IDE?
Grüße
rubberman
(hatte die Liste noch alphanumerisch sortiert um mit emplace_hint arbeiten zu können, aber das hat nur Einfluss auf das Einlesen, nicht auf die Ausgabe)
Grüße
rubberman
(hatte die Liste noch alphanumerisch sortiert um mit emplace_hint arbeiten zu können, aber das hat nur Einfluss auf das Einlesen, nicht auf die Ausgabe)
Haha, nee an der Programmiersprache liegt das nicht. Da ist was anderes faul. Schau dir noch mal an, ob das Einlesen geklappt hat, indem du den Inhalt der map ausgibst.
Falls ja, schreib mal deinen Morsecode zu einen ofstream statt zum cout. Irgendwie muss der Bug zu finden sein.
Was mir noch in den Sinn kommt: Falls du einen HEX Editor hast, schau dir deine Liste mal damit an. Wenn du Windows Zeilenumbrüche (0D 0A) drin hast, die Datei aber unter Linux nutzt (wo der Zeilenumbruch nur 0A wäre), kann es sein, dass das Carriage Return (0D) mit in den string gelesen wird. Bei der Ausgabe würde das dazu führen, dass der Cursor an den Zeilenanfang zurück springt und die vorherige Ausgabe überschreibt. Das würde auch erklären, warum es mit endl funktioniert, da dann in eine neue Zeile gesprungen wird und somit die vorherige Ausgabe nicht überschrieben werden kann.
Grüße
rubberman
for (const auto& elem : dictionary) std::cout << elem.first << ' ' << elem.second << std::endl;
Was mir noch in den Sinn kommt: Falls du einen HEX Editor hast, schau dir deine Liste mal damit an. Wenn du Windows Zeilenumbrüche (0D 0A) drin hast, die Datei aber unter Linux nutzt (wo der Zeilenumbruch nur 0A wäre), kann es sein, dass das Carriage Return (0D) mit in den string gelesen wird. Bei der Ausgabe würde das dazu führen, dass der Cursor an den Zeilenanfang zurück springt und die vorherige Ausgabe überschreibt. Das würde auch erklären, warum es mit endl funktioniert, da dann in eine neue Zeile gesprungen wird und somit die vorherige Ausgabe nicht überschrieben werden kann.
Grüße
rubberman
Ich lach mich weg. Ich spiele die ganze Zeit auf Win10 und bei dir funktioniert es ausgerechnet nicht mit Win10. Naja, egal.
Sag ich doch
Grüße
rubberman
Sag ich doch
Grüße
rubberman