2011-12-16 6 views
3

Мне нужно ваше мнение о том, что происходит не так.C++ Та же программа: два разных результата. Может быть, из-за оператора >>?

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

Затем я пошел в uni, чтобы отправить свою программу с помощью 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(); 
    } 
    } 
} 
+4

Любой шанс 'home == windows == true && uni == linux == true'? – FailedDev

ответ

7

Это является симптомом различных newline representations.

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

В «uni» ваши символы новой строки 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; 
+0

Итак, я изменил идентификаторы, чтобы они были более явными. – user1102867

+0

Это было просто в стороне, это не решит вашу проблему. Вам нужно закодировать CR + LF. – Johnsyweb

+0

Кажется, что это будет так же просто, как изменить ваши проверки новой строки от 'if (l == '\ n')' to 'if (letter == '\ n' || letter == '\ r')', но я не тестировал ваш код. – Johnsyweb

 Смежные вопросы

  • Нет связанных вопросов^_^