2014-12-13 3 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++ strings или Vectors. Я намерен использовать C Style strings

+0

Каков вывод, который вы на самом деле получаете? – 0x499602D2

+1

Ваш вопрос в настоящее время не очень ясен. Что именно вы получаете прямо сейчас, и что вы хотите получить вместо этого? –

+0

@JerryCoffin, см. Отредактированный вопрос. –

ответ

0

Не используйте персональные массивы в первую очередь. Это можно легко очистить с помощью std::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'. Я уверен, что это строка или две, которые нуждаются в настройке, но это значило бы много, если бы вы помогли мне –

1

Манипулятор std::ws немедленно уничтожает любые ведущие пробелы. Если вы хотите включить/отключить автоматическое пропущение пробелов для отформатированных ввода, вы должны использовать std::skipws или std::noskipws. По умолчанию пропускается пробел. Это относится только к [правильно реализованным] операторам ввода (>>).

Чтобы пропустить пробелы перед входом бесформатного вы будете использовать std::ws, например .:

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

Как использовать его с моими массивами строк 'c style? –

+0

Что не так с '(std :: cin >> std :: ws) .getline (s, n)'? –

+0

Все! Я использую 'istream operator' не' cin'! Кроме того, что произойдет, если после разделителя ':' ничего не происходит. Он будет читать следующую строку, и я не хочу, чтобы это произошло –

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

В то время как при работе на поток можно удалить только ведущие белые пробелы, когда вы работаете с строкой, вы также можете удалить белые пробелы.

Обратите внимание, что перед get, которые приходят после cin>>, вы должны есть белые пространства на потоке.