how-to
Goto Top

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.

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

Content-Key: 344276

Url: https://administrator.de/contentid/344276

Printed on: April 19, 2024 at 20:04 o'clock

Member: atze187
atze187 Jul 24, 2017 at 12:31:14 (UTC)
Goto Top
Hi,

C ist schon lange her,. aber müsste es in der for-Bedingung nicht text.length() heißen?

Atze
Member: How-To
How-To Jul 24, 2017 at 12:34:16 (UTC)
Goto Top
@atze187
liefert beides die länge vom string
an der ausgabe ändert sich nichts, ob ich size() oder length() stehn hab
Member: MrCount
MrCount Jul 24, 2017 updated at 13:22:27 (UTC)
Goto Top
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... face-wink

hier
steht
dein Code

Weiterhin gibt es in der Glaskugel einige Lösungen dazu...
Member: How-To
How-To Jul 24, 2017 at 13:33:54 (UTC)
Goto Top
@MrCount
cool, danke. kannte den tag für den code nicht.

hab ja schon danach gesucht, aber ich will es mit eine map lösen. aber ich bekomme es nicht hin.
etwas mit meine ausgabe stimmt nicht.
ich habe es mit einem vektor anstatt mit einer map versucht, aber auch da klappt es nicht.
Member: rubberman
rubberman Jul 24, 2017 updated at 21:05:10 (UTC)
Goto Top
Abgesehen von der unnötigen Variable 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 ----.
. .-.-.-
, --..--
: ---...
; -.-.-.
? ..--..
- -....-
_ ..--.-
( -.--.
) -.--.-
' .----.  
" .-..-.  
= -...-
+ .-.-.
/ -..-.
@ .--.-.
! -.-.--
& .-...
$ ...-..-
     
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
Member: How-To
How-To Jul 25, 2017 updated at 10:14:10 (UTC)
Goto Top
@rubberman
Stimmt, die Variable code ist echt unnötig, danke schonmal dafür.

Bei mir stimmt irgendetwas mit der ausgabe nicht.
Der Code funktioniert wenn ich ein endl hinzufüge
also:
- cout << myMap.find(text.at(i))->second << " "; ---> funktioniert nicht
- cout << myMap.find(text.at(i))->second << " " << endl; ---> funktioniert, aber mit Zeilenumbruch


Ich habe habe dein Code ausgeführt und es kommt zum selben Problem wie bei mir. Die Ausgabe ist nicht vollständig.
unbenannt
Member: rubberman
rubberman Jul 25, 2017 at 13:30:28 (UTC)
Goto Top
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
Member: How-To
How-To Jul 25, 2017 at 17:38:17 (UTC)
Goto Top
@rubberman
Ich habe es auch mit flush ausprobiert und ich habe es auf Ubuntu in eine VM laufen lassen, ich bekomme immer dasselbe Problem.

Danke, aber schonmal für die Hilfe
Member: rubberman
Solution rubberman Jul 25, 2017 updated at 18:18:27 (UTC)
Goto Top
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

morse
(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)
Member: How-To
How-To Jul 25, 2017 at 20:59:26 (UTC)
Goto Top
@rubberman
Vielen Dank für die Hilfe, aber ich gebe es auf.
Ich habe jetzt 3 IDE's ausprobiert und 3 Compiler, aber iwie klappt es nicht.
Ich sollte auf eine andere Programmiersprache umsteigen face-smile
Member: rubberman
rubberman Jul 25, 2017 updated at 22:03:54 (UTC)
Goto Top
Zitat von @How-To:
Ich sollte auf eine andere Programmiersprache umsteigen face-smile
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.
for (const auto& elem : dictionary) std::cout << elem.first << ' ' << elem.second << std::endl;
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
Member: How-To
How-To Jul 26, 2017 at 00:44:49 (UTC)
Goto Top
@rubberman
Sooo. Ich hab jetzt Windows 10 runter geschmissen und Ubuntu installiert und jetzt funktioniert es mit dem Code, den ich schon von Anfang an hatte.

Ich danke dir vielmals für die Hilfe.
Member: rubberman
rubberman Jul 26, 2017 at 06:29:12 (UTC)
Goto Top
Ich lach mich weg. Ich spiele die ganze Zeit auf Win10 und bei dir funktioniert es ausgerechnet nicht mit Win10. Naja, egal.

Zitat von @How-To:
und jetzt funktioniert es mit dem Code, den ich schon von Anfang an hatte.
Sag ich doch face-smile

Grüße
rubberman