如何在不破坏令牌的情况下创建换行符?

How to create a newline without breaking the token?

提问人:UnknownPeach 提问时间:6/21/2023 最后编辑:UnknownPeach 更新时间:6/21/2023 访问量:47

问:

所以我尝试在 C++ 中写入文件 I/O,用户想要翻译不同的语言,例如莫尔斯电码到英语。我使用函数 morseToEnglish() 并将其作为输出文件的令牌传入。我遇到的问题是我得到了正确的输出,但我在某处缺少换行符。

这是我到目前为止所拥有的:

        char morsing[256]; //reading line by line
        if (inputfile.is_open())
        { 
            while (inputfile.getline(morsing, 256)) // reading character by character
            {                                    
                token = strtok(morsing, "|"); //break each word into token
                cout << "Read the input file: " << "morsingMC.mc" << endl;
                while (token != NULL)
                {
                    **outputfile << morseToEnglish(morsing); **
                    token = strtok(NULL, "|");

                } 
            } 
        }

如果我在做

outputfile << morseToEnglish(morsing); 

这将是输出:

123 456 789123 456 789123 456 789123 456 789123 456 789

而不是:

123 456 789
123 456 789
123 456 789
123 456 789
123 456 789

我还尝试在我的输出文件中使用 endl 和“\n”,但这会将每个单词输出到令牌中。这是一个很小的变化,但是我怎样才能修改我的换行符,以便我的输出在不破坏令牌的情况下转到换行符?

编辑:morseToEnglish() 是一个将莫尔斯电码转换为英文的函数,该函数位于头文件中,inputfile/outputfile 分别为 ifstream/ofstream

C++ file-io 令牌 行符 strtok

评论

0赞 Louis Go 6/21/2023
内容是什么,实现什么?inputfilemorseToEnglish()
0赞 Louis Go 6/21/2023
我建议使用 godbolt.org 创建一个独立的最小可重现示例,以便您的问题更快地得到解答。
0赞 UnknownPeach 6/21/2023
inputfile 是一个 ifstream,morseToEnglish() 是一个将莫尔斯电码转换为英语的函数
0赞 Louis Go 6/21/2023
那么,如果您的问题是“为什么不输出换行符”,那么在不知道实现的情况下,任何人如何提供帮助?除非我们掌握所有细节,否则我不清楚您的问题。您的代码片段不包含换行符,因此我认为它已插入“morseToEnglish()”morseToEnglish()morseToEnglish()
0赞 UnknownPeach 6/21/2023
morseToEnglish 位于已实现的头文件中

答:

0赞 Jerry Coffin 6/21/2023 #1

好吧,让我们从一个非常简单的建议开始:当你写C++时,忘记你甚至听说过。只是永远不要使用它。strtok

当你在做这件事时,可能也忘记了它的存在。如果要读取一行数据,通常应选择。这适用于 --,这通常应该是您如何存储/表示/操作字符串的首选。std::istream::getlinestd::getlinestd::string

是的,所有这些都有例外,但它们是合理的起点,直到/除非您有某些特定原因不这样做。

谈到这个问题,我推测你有一些意见,比如:

<token>|<token>|<token>|<token>\n

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

...|---|...

到目前为止,似乎至少有点接近现实?

我还猜测您希望实现的是一行阅读,将该行上的每个标记翻译成英文,打印出标记,打印换行符,然后继续下一个,并重复直到文件末尾。

假设是这种情况,我会写这样的代码:

std::string line;

while (std::getline(inputfile, line)) {
    process(line);
}

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

void process(std::string const &line) {
    std::istringstream buffer(line);

    std::string token;
    while (std::getline(buffer, token, '|')) {
        outputfile << morsetoenglish(token);
    }
    outputfile << '\n';
}

那是在猜测你想要什么,但如果我没看错的话,它似乎至少相当接近。