C ++ Одна и та же программа: два разных результата. Может быть, из-за оператора >>? - PullRequest
3 голосов
/ 17 декабря 2011

Мне нужно ваше мнение о том, что происходит не так.

Из дома я написал программу с использованием Bloodsheed и получил желаемый результат.Целью программы является отображение строк из исходного файла для вывода текста с определенной шириной.Исходный файл нельзя анализировать построчно.Вместо этого это должно быть прочитано, используя символ и строковое слово.

Затем я пошел в универ, чтобы представить свою программу, используя TextPad и Borland: вывод другой: пробелы между словами и некоторыми символами конца строки игнорируются.Я не понимаю, что происходит.Я провел весь день без дела.Компилятор по-разному использует оператор >> для чтения строки?Похоже, что в первом случае он останавливается перед символом пробела или конца строки, во втором он отбрасывает их.У вас есть предложение по поводу проблемы?

Дома успешный вывод:

Max line length: 40

___Inglis_(1994)_describes_it_thus:

"For_output_of___floating-point_numbers,
the_format_strings_used_by_printf_may
include_%f_or_%e_(or_%g,_which_we_will
ignore).__These_have_much_in_common_with
%i:

____"A_minus_sign_indicates_left
justification,_a_plus_sign_indicates
that_the_converted_value_will_start_with
a_plus_sign_if_it_is_positive,_and_a
minimum_field_width_and/or_a_precision
may_be_specified.

В универе:

Max line length: 40

___Inglis(1994)describesitthus:

"Foroutputof__floating-pointnumbers,the
formatstringsusedbyprintfmayinclude%for
%e(or%g,whichwewillignore)._Thesehave
muchincommonwith%i:
____"Aminussignindicatesleft
justification,aplussignindicatesthatthe
convertedvaluewillstartwithaplussignifit
ispositive,andaminimumfieldwidthand/ora
precisionmaybespecified.

функция, которая работает неправильно:

void Text::display(ofstream & out)
{ ifstream from(infileName.c_str());
  if (from.fail())
  { cerr<<infileName<<" not open\n";
    exit(1);
  }
  out<<"Max line length: "<<lineLength<<endl<<endl;
  string s, w;   //s stands for space, w for word
  char l;        //l stands for letter
  int c=0;       //c syands for count
  while(true)
  { if(static_cast<int>(w.length())>0)
    {  if(lineLength<w.length())
       { cerr <<"The line length "<<lineLength
             <<" is not long enough.\n"<<"The longuest word is "
             <<w<<" and has "<<w.length()
             <<" letters.\n";
         exit(1);
       }
       c+=w.length();
       out<<w;
       w.erase();
    }
    from.get(l);
    if (from.fail())
    {  out<<endl;
       break;
    }
    if (l=='\n')
    {  out<<l;
       s.erase();
       c=0;
       continue;
    }
    while (l==' ')
    {  s.push_back('_');
       c++;
       from.get(l);
    }
    if (l=='\n')
    {  out<<l;
       s.erase();
       c=0;
       continue;
    }
    from.putback(l);
    from>>w;
    c+=w.length();
    if (lineLength<c)
    {  out<<endl;
       s.erase();
       c=0;
    }
    else if(w.length()>0)
    {  out<<s<<w;
       w.erase();
       s.erase();
    }
  }
}

1 Ответ

7 голосов
/ 17 декабря 2011

Это симптоматика различных представлений новой строки .

В «доме» ваши новые строки - LF ('\n' или 0x0A).

В "уни" ваши новые строки - CR + LF ('\r\n' или 0x0D0A).

Ваш код допускает только новые строки LF.


В сторону ...

string s, w;   //s stands for space, w for word
char l;        //l stands for letter
int c=0;       //c syands for count

C ++ допускает идентификаторы длиннее одного символа. Следующее является более выразительным, устраняет необходимость в комментариях и значительно упростит поддержку вашего кода.

std::string space, word;
char letter;
int count = 0;
...