2016-09-11 5 views
0

Я выполняю задание, которое читается в данных из текстового файла, и я должен помещать данные в вектор при фильтрации номеров, начинающихся с 0 и комментариев. У меня есть все, кроме фильтрации комментариев. То, что я имею в теории, должно работать, но у меня просто возникают проблемы с его исполнением. Это код проблемы:C++: Удаление комментариев из строки?

vector<string> nums_after; 
for(int i = 0; i < nums_before.size(); i++) 
{ 
    string current = nums_before[i]; 
    if (current.front() == '(') 
    { 
     current.erase(current.find("(*"), current.find("*)")); 
    } 
    if (current.front() == '0') 
    { 
     continue; 
    } 
    nums_after.push_back(current); 
} 

Мой пример файл выглядит следующим образом:.

101481 
10974 
1013 
(* comment *)0 
28292 
35040 
35372 
0000 
7155 
7284 
96110 
26175 

Но мой код фильтрует только на (* и даже не пропуска после звездочки Я думаю, что я просто возникли проблемы с объединением функций erase() и find(). У кого-нибудь есть предложения?

EDIT: Реализована моя проблема в том, что строка комментария разбивалась на три отдельные строки: (*, комментарий и *). 0. Теперь я подозреваю проблему с моей функцией getline. Вот что она выглядит s:

int main() { 
string line; 
string fileName; 
cout << "Enter the name of the file to be read: "; 
cin >> fileName; 

ifstream inFile{fileName}; 

istream_iterator<string> infile_begin {inFile}; 
istream_iterator<string> eof{}; 
vector<string> nums_before {infile_begin, eof}; 
while (getline(inFile, line)) 
{ 
    nums_before.push_back(line); 
} 

Это происходит прямо перед первым блоком кода.

+0

Как вы должны обрабатывать что-то с вложенными комментариями? '10 03 (* 05 11 (* 10 03 *) 10 01 *) 03 100' требует разных методов разбора в зависимости от того, что говорят ваши инструкции. EDIT: Вы также разбираете целые числа? – druckermanly

+0

Я должен избавиться от всего, что находится между комментариями, но текстовые файлы, которые моя программа должна обрабатывать, не имеют вложенных комментариев. –

+0

Проверьте мой ответ. Вы должны знать, что стирание принимает начальную позицию и AMOUNT символов для стирания, а не конечную позицию - NOT '(begin, end)', но '(begin, end-begin)' - это приведет к удалению всех символов между 'begin' и 'end', но он не будет касаться найденных символов окончания, поэтому вам нужно добавить свой счет, 2 в вашем примере. – xinaiz

ответ

0

Что находится в nums_before? Я предполагаю, что полный текст разделен пробелами? в этом случае имеет смысл, что он удаляет только (*, потому что это то, что находится в текущей строке, на которую вы смотрите, есть "(*". Следующая строка - это комментарий, а следующая - "*) . 0"

+0

Да, извините, nums_before - это необработанные данные, извлеченные из файла, а nums_after должен быть целыми числами после фильтрации чисел и комментариев с нулевым нулем.То, как текст написан, я не делал этого в коде, поэтому все целые числа, включая (* комментарий *) 0, должны быть одной строкой –

0

в таких ситуациях, вы должны сделать выбор в пользу структуры stack данных или обратной итерации

void func (int &error, int inc, int &i) { 
    error += inc; 
    i -= 2; 
} 

string output; 
for (int i=nums_before.size()-1; i>=0; ++i) { 
    if (nums_before[i] == ')' && nums_before[i-1] == '*') { 
     static int error; 
     func (error, 1, i); 

     while (error != 0) { 
      if (nums_before[i] == ')' && nums_before[i-1] == '*') 
       func (error, 1, i); 
      else if (nums_before[i] == '*' && nums_before[i-1] == '(') 
       func (error, -1, i); 
      else --i; 
     } 
    } else output += nums_before[i]; 
} 

cout << output.reverse() << endl; 

ввода:. 101481 10974 1013 (* comment *)0 28292 35040 35372 0000 7155 7284 96110 26175

выход: 101481 10974 1013 0 28292 35040 35372 0000 7155 7284 96110 26175

0

Простое решение , Но вложенные комментарии не поддерживаются:

std::string removeComments(std::string str) 
{ 
    std::string::size_type begin, end; 
    while((begin = str.find("(*")) != std::string::npos) 
    { 
     if(((end = str.find("*)")) != std::string::npos) && (end > begin)) 
      str.erase(begin, end - begin + 2); 
     else 
      break; 
    } 
    return str; 
} 

Тест:

std::string test = "1745 2355 (* comment *) 0 1454 4352 4234 (* comment *)"; 
std::cout << removeComments(test) << std::endl; 

Выход:

1745 2355 0 1454 4352 4234 

Пример без использования функции:

std::vector<std::string> strings; 
for(int i=0; i<strings.size(); ++i) 
{ 
    std::string::size_type begin, end; 
    while((begin = strings[i].find("(*")) != std::string::npos) 
    { 
     if(((end = strings[i].find("*)")) != std::string::npos) && (end > begin)) 
      strings[i].erase(begin, end - begin + 2); 
     else 
      break; 
    } 
} 
+0

Я попытался включить вашу идею в свой код, но не получил тот же вывод , Мой синтаксис может быть неправильным, потому что я не использовал его как функцию, так как мы должны делать это как прямой код без функций. Я заменил строку 7 моего кода на строки 3-10 вашего кода. –

+0

@AlyssaJune Edited - добавлен не очень модифицировано версия без использования функция. – xinaiz

+0

Он не работал, затем я изменил свою функцию печати, чтобы отделить данные новыми строками, а не пробелами, и увидел, что (* была одна строка, комментарий был другой, а *) 0 была третьей строкой. Теперь я подозреваю, что проблема с моей функцией getline. Я обновлю свой вопрос, чтобы отобразить код. –