如何从文件中读取消息,仅修改单词

How to read a message from a file, modifying only words?

本文关键字:修改 单词 消息 读取 文件      更新时间:2023-10-16

假设我有以下文本:

My name   is   myName. I love 
stackoverflow   .   
Hi, Guys!   There is more than one space after "Guys!" 123 
And also after "123" there are 2 spaces and newline.

现在我需要按原样读取这个文本文件。只需要用字母数字单词做一些动作。在它之后,我必须打印它,改变单词,但空格,换行符和标点不变,并在相同的位置。当改变字母数字时,单词长度保持不变。我已经尝试过用库检查字母数字值,但代码变得非常混乱。还有别的办法吗?

您可以使用fgets()函数逐行读取文件。它将填充char数组,你可以使用这个数组,例如迭代这个数组,将它分成整数;用" fwrite() "功能将固定字符串写入新文件

如果你喜欢用c++的方式处理文件(iostream),你可以使用istream::getline。这将节省空间;但是它会消耗"n"。如果需要保存"n"(有时可以是"r"answers"rn"),可以使用istream::get.

也许你应该看看Boost Tokenizer。它可以将字符串分解为一系列令牌并遍历它们。下面的示例将一个短语分成几个单词:

int main()
{
   std::string s = "Hi, Guys!   There is more...";
   boost::tokenizer<> tok(s);
   for(boost::tokenizer<>::iterator beg = tok.begin(); beg != tok.end(); ++beg)
   {
       std::cout << *beg << "n";
   }
   return 0;
}

但是在您的情况下,您需要提供TokenizerFunc,它将在字母数字/非字母数字边界处拆分字符串。

有关更多信息,请参阅Boost Tokenizer文档和已经提供的char_separator, offset_separator和escaped_listrongeparator的实现。

您的代码变得混乱的原因通常是因为您没有将问题分解为清晰的函数和类。如果您这样做,您将有几个函数,每个函数只做一件事(不混乱)。你的main函数会调用这些简单的函数。如果函数名选择得好,main函数也会变得简短而清晰。

在这种情况下,你的main函数需要做:

  • 循环:读取文件
  • 的每一行
  • 检查每一行是否有"特殊"字出现。
  • 如果出现特殊字,替换为

额外提示:一行文本可以存储为std::string,也可以被std::getline(std::cin, line)读取