k-yamadaのブログ

プログラミングのメモ

fputc(int c, FILE *stream)の仕様

fputc(int c, FILE *stream)は1バイト単位の出力を行う関数です。
引数がchar(1バイト)ではなくint(4バイト)なので、引数に1バイトに収まらない数値(負の数や255以上の数)を指定したらどうなるか確かめてみた。

#include <stdio.h>
#include <stdlib.h>

int main (int argc, const char * argv[])
{
    int num[] = {-1, 0, 1, 255, 256, 257, 258};
    const int numSize = sizeof num /sizeof num[0];
    int i;
    FILE *fp;
    fp = fopen("/Users/xxx/Desktop/c/test.txt", "wb");
    for (i = 0; i < numSize; i++) {
        fputc(num[i], fp);
    }
    fclose(fp);
    
    fp = fopen("/Users/xxx/Desktop/c/test.txt", "r"); 
    for (i = 0; i < numSize; i++) {
        int byte = fgetc(fp);
        printf("%4d(0x%08x) -> %4d(0x%08x)\n", num[i], num[i], byte, byte);   
    }
    fclose(fp);
    return 0;
}

結果

-1(0xffffffff) -> 255(0x000000ff)
0(0x00000000) -> 0(0x00000000)
1(0x00000001) -> 1(0x00000001)
255(0x000000ff) -> 255(0x000000ff)
256(0x00000100) -> 0(0x00000000)
257(0x00000101) -> 1(0x00000001)
258(0x00000102) -> 2(0x00000002)

予想した通りだったが、fputcは引数で渡したint型数値(符号付き)の最下位バイトのみをファイルに出力しているようだ。