假设我有以下文字:
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.
现在我需要按原样阅读这个文本文件。需要仅使用字母数字单词进行某些操作。在它之后,我必须用改变的单词打印它,但空格,换行符和标点符号保持不变并且位于相同的位置。更改字母数字时,长度保持不变。我已尝试使用库检查字母数字值,但代码变得非常混乱。还有其他办法吗?
答案 0 :(得分:0)
您可以使用fgets()
功能逐行阅读文件。它将填充char数组,您可以使用此数组,例如迭代这个数组,将其拆分为alnum单词;更改单词,然后使用“fwrite()
”函数将固定字符串写入新文件。
如果您更喜欢使用C ++处理文件的方式(iostream),则可以使用istream::getline。它会节省空间;但它会消耗“\ n”。如果您需要保存“\ n”(有时可以是'\ r'和'\ r \ n'),您可以使用istream::get。
答案 1 :(得分:0)
也许你应该看看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_list_separator的实现。
答案 2 :(得分:0)
您的代码混乱的原因通常是因为您没有在明确的函数和类中分解您的问题。如果你这样做,你将拥有一些功能,每个功能都只做一件事(而不是凌乱)。然后,您的main
函数将调用这些简单函数。如果选择好功能名称,main
功能也会变得简短明了。
在这种情况下,您的主要功能需要:
额外提示:一行文字可以存储为std::string
,可以std::getline(std::cin, line)