跳过前导空格但不是换行符C ++ istreams

时间:2014-12-14 00:37:43

标签: c++ char whitespace delimiter istream

我正在尝试删除前导空格并将字符存储在空格之后。我不希望新行被视为

这是我正在阅读的文件:

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 Style字符串

这是我的编辑代码,但如果在分包者之后有效字符:,它就不会工作......如果有人可以修复我的代码,那将真的很有意义,对我来说意义重大。< / p>

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;
}

1 个答案:

答案 0 :(得分:0)

您可以这样做:

void eatwhites(istream& stream)
{
  const string skip=" \t";//put here all wanted skip chars (here i put only SPACE and TAB
  while(string::npos != skip.find(stream.peek())){ //if next char in stream exist in skip string 
    stream.ignore();//then ignore it (1 character).
  }
}

修改

以下是我测试它的方式,它对我有用:

请注意,您在阅读后仍需修剪字符串,意味着将'\0'放在最后一个非白色字符后。

如果出现问题,你可以告诉它输入了什么以及你得到了什么。

int main()
{ 
    string s1,s2;
    eatwhites(cin);
    getline(cin,s1, ':');//read until ":"
    eatwhites(cin);
    getline(cin,s2); //read until "\n"
    cout<<"'"<<s1<<"':'"<<s2<<"'"<<endl;
    return 0;
}

输入我已尝试过:

  • [SPACE] 123:[SPACE] 456给出:&#39; 123&#39;:&#39; 456&#39;
  • [SPACE] 123:[SPACE]给出:&#39; 123&#39;:&#39;&#39;

<强> EDIT2:

使用char数组,它可以像以下一样使用:

#define MAX_FIELD 128
int main()
{ 
    char s1[MAX_FIELD],s2[MAX_FIELD];
    eatwhites(cin);
    cin.getline(s1, MAX_FIELD, ':');
    eatwhites(cin);
    cin.getline(s2, MAX_FIELD);
    cout<<"'"<<s1<<"':'"<<s2<<"'"<<endl;

    return 0;
}

相同输入的结果相同。