3

I need your opinion of what is going wrong.

From home I wrote a program using Bloodsheed and got the wanted result. The purpose of the programm is to display lines from a source file to output a text with a certain width. The source file can not be analysed line by line. Instead it should be read using char and string word.

Then I went to uni to submit my program using TextPad and Borland: the output is different: spaces between words and some end of line characters are ignored. I do not understand what is going on. I have spent the all day on the case unsuccessfully. Do compiler use differently the operator >> to read string? It looks like in the first case it stops before the space or end of line character in the second one it discard them. Have you got a suggestion about the problem?

At home the successful output is:

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.

At uni:

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.

function which is going wrong:

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();
    }
  }
}
Johan
  • 74,508
  • 24
  • 191
  • 319

1 Answers1

7

This is symptomatic of different newline representations.

At "home", your newlines are LF ('\n' or 0x0A).

At "uni", your newlines are CR+LF ('\r\n' or 0x0D0A).

Your code only allows for LF newlines.


As an aside...

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

C++ allows for identifiers longer than a single character. The following is more expressive, removes the need for comments, and will make maintaining your code much easier.

std::string space, word;
char letter;
int count = 0;
johnsyweb
  • 136,902
  • 23
  • 188
  • 247
  • So I have amended the identifiers to be more explicit. – user1102867 Dec 17 '11 at 00:03
  • That was just the aside, it won't solve your problem. You need to code for CR+LF. – johnsyweb Dec 17 '11 at 00:06
  • It seems that this will be as simple as changing your newline checks from `if (l=='\n')` to `if (letter == '\n' || letter == '\r')`, but I have not tested your code. – johnsyweb Dec 17 '11 at 00:21
  • I have changed 'if (l=='\n')' as suggested. The warning has disappeared. I am at the point of exhaustion: I have worked half of the day on the issue. So I need a good night sleep. I will try tomorrow to code for CR+LF tomorrow: it is completely unknown for me. I have noticied that at home or at uni my source file uses LF and my output file uses CR+LF. Thank you for all your comments. – user1102867 Dec 17 '11 at 00:34
  • *Which* warning has disappeared? – johnsyweb Dec 17 '11 at 02:02
  • Hi I am back. I shared my problem with my teacher via an email before Christmas. The main problem is due to the compilers: The compiler used with Bloodshed has an extraction operator which stops before the space or end of line character when reading data as a string whereas the compiler Borland discards them in the same situation. Because I had to use Borland I read all the input one character after another and managed to submit a successful program on time before eating some Christmas turkey. – user1102867 Dec 30 '11 at 17:06
  • Really? Can you provide a [Short, Self Contained, Correct (Compilable), Example](http://sscce.org/) that demonstrates the difference between these two compilers? – johnsyweb Dec 31 '11 at 09:42