c++ 如何在不破坏标记的情况下创建换行符?

cigdeys3  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(169)

因此,我试图在C++中写入一个文件I/O,其中用户希望翻译一种不同的语言,例如将莫尔斯电码翻译为英语。我使用morseToEnglish()函数并将其作为输出文件的标记传入。我遇到的问题是,我得到了正确的输出,但我在某个地方缺少了一个换行符。
以下是我到目前为止的情况:

  1. char morsing[256]; //reading line by line
  2. if (inputfile.is_open())
  3. {
  4. while (inputfile.getline(morsing, 256)) // reading character by character
  5. {
  6. token = strtok(morsing, "|"); //break each word into token
  7. cout << "Read the input file: " << "morsingMC.mc" << endl;
  8. while (token != NULL)
  9. {
  10. **outputfile << morseToEnglish(morsing); **
  11. token = strtok(NULL, "|");
  12. }
  13. }
  14. }

如果我在做

  1. outputfile << morseToEnglish(morsing);

这将是输出:

  1. 123 456 789123 456 789123 456 789123 456 789123 456 789

而不是:

  1. 123 456 789
  2. 123 456 789
  3. 123 456 789
  4. 123 456 789
  5. 123 456 789

我也试过在我的输出文件中使用endl和“\n”,但这会将每个单词输出到token中。这是一个很小的变化,但是我如何修改我的换行符,使我的输出将转到一个换行符,而不破坏令牌?
编辑:morseToEnglish()是一个将莫尔斯电码转换为英文的函数,该英文在头文件中,inputfile/outputfile分别为ifstream/ofstream

x6h2sr28

x6h2sr281#

好吧,让我们从一个非常简单的建议开始:当你在编写C++时,忘记你甚至听说过strtok。别用它永远别用
当你在做这个的时候,最好也忘记std::istream::getline的存在。如果你想读取一行数据,你的第一选择通常应该是std::getline。这与std::string一起工作--它通常是存储/表示/操作字符串的首选。
是的,所有这些都有例外,但它们都是合理的起点,除非你有一些特别的理由去做。
说到这个问题,我猜你有一些输入,比如:

  1. <token>|<token>|<token>|<token>\n

因此,例如,如果一行输入包含经典的“SOS”,它将是类似于:

  1. ...|---|...

到目前为止,至少看起来很接近现实?
我还猜测,您希望实现的是读取一行,将该行上的每个标记翻译成英语,打印出标记,打印一个新行,然后继续下一行,重复直到文件结束。
假设情况是这样的,我会写这样的代码:

  1. std::string line;
  2. while (std::getline(inputfile, line)) {
  3. process(line);
  4. }

然后process将处理一行输入,如下所示:

  1. void process(std::string const &line) {
  2. std::istringstream buffer(line);
  3. std::string token;
  4. while (std::getline(buffer, token, '|')) {
  5. outputfile << morsetoenglish(token);
  6. }
  7. outputfile << '\n';
  8. }

这是在猜测你想要什么,但如果我没有阅读的话,它似乎至少相当接近。

展开查看全部

相关问题