2

I have a basic program I wrote just to test writing to files. It is supposed to put every value from 0 to 255 in a file (out.txt) as a char. However, when I open out.txt in a hex editor, the 11th byte should be 0A, but it is 0D. From here every other value is pushed back so the 12th byte is 0A, the 13th is 0B, all the way to the 256th being FE instead of FF like it should be. I am compiling and running my code using Visual Studio 2017 on Windows 10 if it helps.

main.cpp

#include <iostream> #include <stdio.h> #include <fstream> int main(){ std::ofstream f("out.txt",std::ios::out); for(int i = 0; i < 255; i++){ f << (char)i; } return 0; } 

out.txt (hex values)

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 
1
  • Please don't spam tags. This is not C. Commented Sep 23, 2017 at 20:30

1 Answer 1

11

std::ofstream is trying to be helpful. In text mode, when you write a \n, it actually writes an \r\n, since that's what Windows uses for line breaks. Open the file in binary mode instead of text mode:

std::ofstream f("out.txt", std::ios::out | std::ios::binary); 

Also, you are only writing 0 - 254, so the last one, 255, is missing.

Sign up to request clarification or add additional context in comments.

5 Comments

It is not windows being helpful, it is a standard-mandated behavior (for windows systems).
Are you sure? I really can't believe the c++ standard mandates it, sounds more like implementation-defined behavior, no?
@Revolver The standard certainly doesn't say anything specific about how text files are treated in windows.
Standard says that \n should be converted into system-appropriate linebreak symbol/sequence in text mode. Windows appropriate linebreak sequence is \r\n.
Windows appropriate linebreak sequence is \r\n - not really; some old Windows applications require it - nothing to do with the OS. All my own text files on windows use \n and work perfectly.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.