C++ Одна и та же программа: два разных результата. Может быть, из-за оператора >>?
Мне нужно ваше мнение о том, что происходит не так.
Из дома я написал программу с использованием Bloodsheed и получил желаемый результат. Целью программы является отображение строк из исходного файла для вывода текста с определенной шириной. Исходный файл нельзя анализировать построчно. Вместо этого его следует читать, используя char и string word.
Затем я пошел в универ, чтобы представить свою программу, используя 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 ответ
Это является симптомом различных представлений новой строки.
В "доме", ваши новые строки являются 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;