2016-11-04 1 views
1

Я столкнулся с this question и получил еще один вопрос о предоставлении ответа (я не могу комментировать, так как я новичок в stackoverflow). Парень, который ответил на это, кажется правильным, заменив < < >> для cin и cout. Но проблема в том, что все полуколоны не появятся в новом выходном файле.Управление потоками строк ввода/вывода (правильные операторы Cin/cout <</>>)

Я знаю, что в то время как std::getline(input, command, ';') стирает все точки с запятой, но Theyre должны быть возвращены с заявлением еще в конце, но не заменяется, когда я запускаю его. И если я пропущу ';' из getline утверждение все в выходном файле испортится.

Как вы показываете, что это означает, что полуколока показывает?

void print(ifstream& input,ofstream& output) 
{ 
    bool first = true; 
    std::string command; 
    while(std::getline(input, command, ';')) 
    { // loop until no more input to read or input fails to be read 
     if (command.find("cin")!= std::string::npos) 
     { // found cin somewhere in command. This is too crude to work. See below 
      size_t pos = command.find("<<"); // look for the first << 
      while (pos != std::string::npos) 
      { // keep replacing and looking until end of string 
       command.replace(pos, 2, ">>"); // replace with >> 
       pos = command.find("<<", pos); // look for another 
      } 
     } 
     else if (command.find("cout")!= std::string::npos) 
     { // same as above, but other way around 
      size_t pos = command.find(">>"); 
      while (pos != std::string::npos) 
      { 
       command.replace(pos, 2, "<<"); 
       pos = command.find(">>", pos); 
      } 
     } 
     if (! first) 
     { 
      output << command; // write string to output 
     } 
     else 
     { 
      first = false; 
      output << ';' << command; // write string to output 
     } 
    } 
} 
+0

Функция 'std :: getline' не изменяет содержимое мусора. –

+0

Пожалуйста, отредактируйте ваш вопрос с кодом, с которым у вас возникли проблемы. –

+0

Извинения. Ред. – Deegeeek

ответ

0

Проблема здесь:

 if (! first) 
     { 
      output << command; // write string to output 
     } 
     else 
     { 
      first = false; 
      output << ';' << command; // write string to output 
     } 

В первой итерации else ветвь запускается на выполнение и точка с запятой печатается.

В любой последующей итерации выполняется ветка if, что делает не печатать точку с запятой.

Исправить легко: замените две линии, начиная с output <<.

+0

Спасибо. Кажется, сейчас он работает. Тем не менее, в начале файла txt, который я тестировал, появляется двоеточие. Все точки с запятой, которые были исключены с возвратом getline, но новый отображается как первый символ в файле. – Deegeeek

+0

Фактически исправлено. В выражении 'if (! Flag)' я только что добавил и '&&! (Line.find (" # ")! = String :: npos))' – Deegeeek