提问人:UnknownPeach 提问时间:6/21/2023 最后编辑:UnknownPeach 更新时间:6/21/2023 访问量:47
如何在不破坏令牌的情况下创建换行符?
How to create a newline without breaking the token?
问:
所以我尝试在 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++时,忘记你甚至听说过。只是永远不要使用它。strtok
当你在做这件事时,可能也忘记了它的存在。如果要读取一行数据,通常应选择。这适用于 --,这通常应该是您如何存储/表示/操作字符串的首选。std::istream::getline
std::getline
std::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';
}
那是在猜测你想要什么,但如果我没看错的话,它似乎至少相当接近。
评论
inputfile
morseToEnglish()
morseToEnglish()
morseToEnglish()