简体   繁体   中英

C++ function misreading character from string

I am working on a project to get used to using OOP in C++. The program should take an arbitrary string from "input.txt" and output it to "output.txt" tranlated into morse code. It would be working, except that certain characters are being interpreted as "." instead of what it should be. I think that showing the code would make more sense.

Output when run:

Debug, untranslated: T
Debug, translated: -
Debug, untranslated: h
Debug, translated: ....
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: r
Debug, translated: .-.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated: d
Debug, translated: -..
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: f
Debug, translated: ..-.
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: x
Debug, translated: -..-
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: j
Debug, translated: .---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: u
Debug, translated: ..-
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: m
Debug, translated: --
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: p
Debug, translated: .--.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: s
Debug, translated: ...
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: v
Debug, translated: ...-
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated: r
Debug, translated: .-.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: t
Debug, translated: -
Debug, untranslated: h
Debug, translated: ....
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: e
Debug, translated: .
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: b
Debug, translated: -...
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: r
Debug, translated: .-.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: w
Debug, translated: .--
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: n
Debug, translated: -.
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated:  
Debug, translated:  
Debug, untranslated: d
Debug, translated: -..
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: o
Debug, translated: ---
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: g
Debug, translated: --.
Debug, untranslated: -
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: .
Debug, translated: ?
Debug, untranslated: 

Debug, translated: ?

input.txt:

The red fox jumps over the brown dog.

output.txt (filled after running):

-.???. .??.-?? .???-??-??? .???.??-?.???.?? -??.???..?? -.???. -???.??-??.??-? -??-??-????

main.cpp:

#include <iostream>
#include <string>
#include <fstream>
#include <unistd.h>
#include <string>
#include <sstream>
#include "morseTranslator.cpp"

using namespace std;

ifstream input("/Users/michaelsimanski/Documents/Projects C++/morse-coded/input.txt"); //init input controller
ofstream output("/Users/michaelsimanski/Documents/Projects C++/morse-coded/output.txt"); //init output controller

int main(int argc, char const *argv[])
{
  if (!(input.is_open() && input.good()))
  {
    cout << "ifstream is FUBAR, exiting";
  }
  else
  {
    cout << "ifstream is open and good, proceeding" << "\n"; //it is right and truly good

    std::stringstream fileContents; //init message, that will be filled by input.txt
    fileContents << input.rdbuf();

    output << morseTranslator::translate(fileContents.str());

    return 0;
  }

  return 0;
}

morseTranslator.cpp:

#include <iostream>
#include "morseTranslator.h"

using namespace std;

string morseTranslator::convertChar(char x) //converts a char to morse equivalent
{
  switch(x)
  {
    case ' ': return " ";
    case 'A':
    case 'a': return ".-";
    case 'B':
    case 'b': return "-...";
    case 'C':
    case 'c': return "-.-.";
    case 'D':
    case 'd': return "-..";
    case 'E':
    case 'e': return ".";
    case 'F':
    case 'f': return "..-.";
    case 'G':
    case 'g': return "--.";
    case 'H':
    case 'h': return "....";
    case 'I':
    case 'i': return "..";
    case 'J':
    case 'j': return ".---";
    case 'K':
    case 'k': return "-.-";
    case 'L':
    case 'l': return ".-..";
    case 'M':
    case 'm': return "--";
    case 'N':
    case 'n': return "-.";
    case 'O':
    case 'o': return "---";
    case 'P':
    case 'p': return ".--.";
    case 'Q':
    case 'q': return "--.-";
    case 'R':
    case 'r': return ".-.";
    case 'S':
    case 's': return "...";
    case 'T':
    case 't': return "-";
    case 'U':
    case 'u': return "..-";
    case 'V':
    case 'v': return "...-";
    case 'W':
    case 'w': return ".--";
    case 'X':
    case 'x': return "-..-";
    case 'Y':
    case 'y': return "-.--";
    case 'Z':
    case 'z': return "--..";
    default: return "?";
  }
}

string morseTranslator::translate(string toBeTranslated)
{
  string translatedText = ""; //string form of what is being translated

  for (int i = 0; i < toBeTranslated.length(); i++)
  {
    cout << "Debug, untranslated: " << toBeTranslated.at(i) << endl;
    cout << "Debug, translated: " << morseTranslator::convertChar(toBeTranslated.at(i)) << endl;
    toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));
  }
  return toBeTranslated;
}

morseTranslator.h:

#include <iostream>

using namespace std;

class morseTranslator
{
public:
  static string convertChar(char x);
  static string translate(string toBeTranslated);
};
toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));

will change the the string while you are iterating and convertChar is tripping over the inserted dots and dashes.

You are better off appending to and returning translatedText . Looks like you were headed this route at some point.

You problem is coming from

toBeTranslated.replace(i, 1, morseTranslator::convertChar(toBeTranslated.at(i)));

You trample all over the string with this as each next iteration is parsing over what you just replaced into the string. What you should be doing is using translatedText in the loop like

translatedText += morseTranslator::convertChar(toBeTranslated.at(i));

and then you return translatedText from the function. Otherwise what you would need to to is incrment i by the amount of characters morseTranslator::convertChar(toBeTranslated.at(i)) added to the string so you are trying to convert what you already converted.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM