Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't fwrite() write a Binary File using "wb", in C, on Mac OS X?

For the sake of learning C and understanding the difference between Binary Files and Text Files, I'm attempting to write a string to file as both file types like so:

char * string = "I am a string!";

FILE * filePtrA = fopen("/output.txt", "wt");
fwrite(string, strlen(string), 1, filePtrA);

FILE * filePtrB = fopen("/output.bin", "wb");
fwrite(string, strlen(string), 1, filePtrB);

fclose(filePtrA);
fclose(filePtrB);

However both "wt" and "wb" are writing as a Text File, where "wb" should be writing as a Binary File. Hex appears like so for both files:

49 20 61 6D 20 61 20 73 74 72 69 6E 67 21

Why is this happening, and how can I write something as a Binary File?

I have read that the OS (Mac OS X 10.6 - GCC 4.2) might not differentiate between Binary and Text Files, though I'm still stumped why a hex editor wouldn't detect any difference.

like image 922
Dave Avatar asked Nov 11 '10 19:11

Dave


1 Answers

All files are binary.

The difference between "text files" and "binary files" in the context of fopen is that the standard library may use a filter for reading and writing the file when in text mode. In binary mode, what you write is always what is written.

The only practical example I know of is in Windows, where opening a file in text mode will make it convert between Windows-style line endings (CRLF, "\r\n") and C-style/Unix-style line-endings (LF, "\n"). For example when you open a file for reading in Windows in text mode, line endings will appear as "\n" in your program. If you were to open it in binary mode, line endings would appear as "\r\n" in your program.


You can also inspect your file with cat, for example:

cat filename

You should get the output: I am a string!

like image 135
Magnus Hoff Avatar answered Sep 19 '22 11:09

Magnus Hoff