2014-12-13 127 views
0

我试图删除空格并在空格后面存储字符。更有效的删除空格的方法

这是我读文件来自:

Map: Out of planet 
Player: Max 

这是我的代码

istreams.get(characters, 50, ':'); 
istreams.get(c); 
istreams.getline(kill.killMap, 35); 
if(kill.killMap[0] = '\0) 
{ 
    cout << "Error; 
    break; 
} 
istreams >> ws; 

istreams.get(characters, 50, ':'); 
istreams.get(c); 
istreams.getline(kill.player, 35); 
if(kill.player[0] = '\0) 
{ 
    cout << "Error; 
    break; 
} 

虽然ws功能从流去除空白,我不认为它的与char阵列相同。会很感激,如果有人可以告诉我,让ws删除空格

这的工作或只是简单的一个有效的方法的一种方式就是我得到:

cout << kill.killMap << endl; 
    Out of planet //THERE IS WHITESPACE 
cout << kill.player << endl; 
     Max //THERE IS WHITESPACE 

我真正想要的:

cout << kill.killMap << endl; 
Out of planet // NOTICE THERE IS NO WHITESPACE 
cout << kill.player << endl; 
Max    // NOTICE THERE IS NO WHITESPACE 

有没有办法做到这一点,而不使用C++ stringsVectors。我打算使用C Style strings

+0

你实际得到的输出是什么? – 0x499602D2 2014-12-13 18:32:06

+1

你的问题目前还不是很清楚。你现在究竟得到了什么,你想得到什么? – 2014-12-13 18:32:45

+0

@JerryCoffin,请参阅编辑的问题。 – 2014-12-13 18:37:54

回答

0

不要首先使用字符数组。这可以用std::string很好地清理。以下代码假定你已经改变了你的成员变量从字符数组为标准string类:

istreams.ignore(std::numeric_limits<std::streamsize>::max(), ':'); 
if (!std::getline(istreams >> std::ws, kill.killMap) || kill.killMap.empty()) 
{ 
    std::cerr << "There has been an error\n"; 
    break; 
} 

istreams.ignore(std::numeric_limits<std::streamsize>::max(), ':'); 
if (!std::getline(istreams >> std::ws, kill.killMap) || kill.killMap.empty()) 
{ 
    std::cerr << "There has been an error\n"; 
    break; 
} 

Demo

这里有一些其他的替代品:

  1. 创建过滤流缓冲区,忽略前:之前的第一个字符。
  2. 制作一个流迭代器,像我为每次迭代所做的那样调用ignore()
  3. 使用regular expressions来匹配每行的模式并提取到字符串。
+0

谢谢,但是如果你可以帮助我使用我的代码,我打算使用字符数组,因为我是'c strings'。我相信这是一两条需要调整的线,但是如果你帮助我,这意味着很多 – 2014-12-13 19:09:36

1

机械手std::ws立即消耗任何领先的空白。如果您想要启用/禁用自动跳过格式的输入的空格,您可以使用std::skipwsstd::noskipws。默认情况下,启用空白跳过。但它只适用于[正确实施]输入运算符(>>)。

要跳过空格中输入格式化的面前你会使用std::ws,例如:

(std::cin >> std::ws).get(c); 
+0

如何将它与'c风格字符串数组'一起使用? – 2014-12-13 19:17:01

+0

'(std :: cin >> std :: ws).getline(s,n)''有什么问题? – 2014-12-13 19:44:08

+0

一切!我正在使用'istream运算符'而不是'cin'!另外,如果':'分隔符之后没有任何内容会发生什么。它会读取下一行,我不希望发生这种情况 – 2014-12-13 19:49:12

0

您可以编写函数像其他答案输入前吃白空间。

你也可以写一个装饰功能修剪从字符串的开头和结尾的空格:

这样的:

string trim(const string& s) 
{ 
    string res; 
    size_t pos1,pos2; 
    pos1 = s.find_first_not_of(" \t\r\n"); 
    pos2 = s.find_last_not_of(" \t\r\n"); 
    if(pos2!=string::npos) 
     pos2++; 
    res = s.substr(pos1,pos2-pos1); 
    return res; 
} 

虽然在流工作时,你可以只删除领先的白色空间,当您使用字符串时,您还可以删除拖尾的白色空格。

注意前getcin>>来后,你必须吃流上的白空间。