【发布时间】:2015-02-12 10:24:58
【问题描述】:
我正在尝试删除前导空格并将字符存储在空格之后。我不想考虑换行符
这是我正在读取的文件:
Map: Out of planet
Player: Max
我的预期结果和我正在寻找的应该是
cout << kill.killMap << endl;
Out of planet // NOTICE THERE IS NO WHITESPACE
cout << kill.player << endl;
Max // NOTICE THERE IS NO WHITESPACE
如果文件看起来像这样......
Map:
Player: Max
map 变量和 player 变量中不应存储任何内容。
虽然 ws 函数从流中删除空格,但我认为它对 char 数组的作用不同。如果有人能告诉我一种让 ws 工作的方法,或者只是一种简单的删除空格的有效方法,我将不胜感激
这就是我得到的:
cout << kill.killMap << endl;
Out of planet //THERE IS WHITESPACE
cout << kill.player << endl;
Max //THERE IS WHITESPACE
有没有办法在不使用 C++ 字符串或向量的情况下做到这一点。我打算使用 C 风格的字符串
这是我编辑的代码,但是如果在分隔符 : 之后有有效字符,它将不起作用...如果有人可以修复我的代码,我会非常感激,这对我来说意义重大。
istreams.get(characters, 50, ':');
istreams.get(c);
istreams.getline(kill.killMap, 35);
while ((is.get(c) != "\n") && (is.get(c) != '\0') )
{
is >> ws;
}
is.getline(kill.killMap, DATA_FILE_SIZE);
if(kill.killMap[0] = '\0)
{
cout << "Error;
break;
}
istreams >> ws;
istreams.get(characters, 50, ':');
istreams.get(c);
while ((is.get(c) != "\n") && (is.get(c) != '\0') )
{
is >> ws;
}
istreams.getline(kill.player, 35);
if(kill.player[0] = '\0)
{
cout << "Error;
break;
}
【问题讨论】:
-
“我打算使用 C 风格的字符串” -- 请注意
std::string的存在是有原因的。手动管理内存在理论上很简单,但在实践中很难做到正确,如果您需要 C 风格的字符串以实现互操作性,则可以使用c_str()。 -
std::ws与字符数组无关。它所做的只是丢弃前导空格,以便下一个字符是有效字符或 EOF。 -
is.get(c) != "\n"总是正确的,除非你有可以想象的最奇怪的内存布局。"\n"是char(&)[2];很确定你想要'\n'。该代码甚至不应该编译,因为充其量您将char与char *进行比较,这显然是不兼容的类型。
标签: c++ char whitespace delimiter istream