Этот маленький цикл printf испускает один дополнительный байт, казалось бы, из ниоткуда, почему? - PullRequest
6 голосов
/ 06 июня 2019

Эта автономная программа при запуске с командной строкой Windows (т.е. test.exe > test.txt) испускает дополнительный байт по причинам, которые я не могу понять.

#include <stdio.h>

int main() {
    int N = 50;
    for (int i = 0; i < N; ++i)
        printf("%c%c%c", (int)(i / (float)N * 255), 0, 255);
}

Можно ожидать, что test.txt будет иметь 150 байт, но он имеет 151. Глядя на него с помощью шестнадцатеричного редактора, вы увидите следующее:

0000 ff05 00ff 0d0a 00ff 0f00 ff14 00ff     
1900 ff1e 00ff 2300 ff28 00ff 2d00 ff33
00ff 3800 ff3d 00ff 4200 ff47 00ff 4c00
ff51 00ff 5600 ff5b 00ff 6000 ff66 00ff
6b00 ff70 00ff 7500 ff7a 00ff 7f00 ff84
00ff 8900 ff8e 00ff 9300 ff99 00ff 9e00
ffa3 00ff a800 ffad 00ff b200 ffb7 00ff
bc00 ffc1 00ff c600 ffcc 00ff d100 ffd6
00ff db00 ffe0 00ff e500 ffea 00ff ef00
fff4 00ff f900 ff

Третья итерация цикла, кажется, является виновником, где вместо этого испускаются четыре байта: 0d0a00ff. Я не могу на всю жизнь понять, почему это произойдет. Я скомпилировал это с Visual Studio 2015, на случай, если это имеет значение.

1 Ответ

5 голосов
/ 06 июня 2019

(int)(2 / (float)5 * 255) равно 10, что является ASCII-представлением символа новой строки, который Windows переводит в свое нормальное представление CRLF.

Нет способа избежать этого поведения (freopen ограничено в Windows) насколько я знаю, но, учитывая, что вы хотите записать двоичные данные, использование функции форматирования текста printf и стандартного вывода, возможно, не идеальный подход.

...