Hm, don't do that on windows. It corrupted binary data, probably because it treated it as text.
Remade it as fopen("bw+"), it works now.
Figured it out from the fact that pcm_u16le sounded less noisy than pcm_s16le. Ascii text only takes first 128 possible values of a byte. I'm not sure if I'm lucky or the opposite. Holy shit. How the f*ck I made this connection.