CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 5 of 5
  1. #1
    Join Date
    Mar 2012
    Posts
    3

    Writing int 10 to a file... what could be easier?

    Ok, here is a bug I can't figure out. Say I want to write 256 bytes to a file... say the numbers 0-255. Easy enough. I'm doing it like this.

    Code:
      ofstream myfile;
      int byte_to_write;
      char c;
      int i;
    
      myfile.open ("Testfile.txt");
      byte_to_write = 0;
      for(i=0;i<256;i++){
    	  c = byte_to_write & 0xFF; // I realize this is unnecessary for this example
                                        // but in practice sometimes I send values over 255
                                        // and only want to write one byte
    	  myfile.write(&c, 1);
    	  byte_to_write++;
      }
    myfile.close();
    OK, so here is where it gets tricky. Here is the file as it appears in a hex editor:

    00 01 02 03 04 05 06 07 08 09 0D 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

    I'll save you the counting and let you know this is 257 bytes, not 256. This is because when byte_to_write = 10, instead of writing 0x0A, 0x0D0A gets written. Only value between 0 and 255 that does this. This same thing happens if I just write "10": 0x0D0A gets written. If you can tell me why, that would be awesome. Thanks.

  2. #2
    GCDEF is offline Elite Member Power Poster
    Join Date
    Nov 2003
    Location
    Florida
    Posts
    12,635

    Re: Writing int 10 to a file... what could be easier?

    I don't use the streams to write files so I can't tell you how to fix it, but it appears you're writing a text file when you should be writing a binary file.

  3. #3
    Join Date
    Apr 1999
    Posts
    27,449

    Re: Writing int 10 to a file... what could be easier?

    Quote Originally Posted by icanhazscreenid View Post
    Ok, here is a bug I can't figure out.
    The bug is that you're writing a carriage return/line feed to the file.

    When you open a file in text mode, the file will interpret 10 and 13 as line feeds and carriage returns, which will result in the file interpreting what you have as a newline character and put that info into the file.

    Also, the end of file for text mode is ASCII 26. So as soon as you write 1A, if you attempted to read the file as a text, it would stop at 1A.

    GCDEF is correct -- if you want to write any byte as a byte without translation, then you need to open the file in binary mode, not text mode.

    Regards,

    Paul McKenzie

  4. #4
    Join Date
    Jan 2009
    Posts
    596

    Re: Writing int 10 to a file... what could be easier?

    GCDEF is correct, this is because you are writing in text mode. The ASCII value 10 is the line-feed character (LF or '\n'). On Unix this signifies a new line in the file. However, Windows uses two characters to signify a new line - a carriage-return (ASCII 13, also called CR or '\r') followed by a line-feed. So Windows is converting LF to CR/LF - hence the extra byte.

    This difference in new-line behaviour on different operating systems is actually why we have 'text' and 'binary' modes in the first place.

    To fix it, either open the file in binary mode:
    Code:
    myfile.open("Testfile.txt", ios::binary)
    or use a version of Unix
    Last edited by Peter_B; May 11th, 2012 at 05:05 AM. Reason: Changed "Textfile.txt" to "Testfile.txt"

  5. #5
    Join Date
    Mar 2012
    Posts
    3

    Re: Writing int 10 to a file... what could be easier?

    Beautiful! You guys are right. Opening the file in binary did the trick. I used Peter_B's ios::binary method and it is all good. Thanks so much for your help.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured