やれたらやるね

やれたらね

C言語 バイナリファイルR/W

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>

#define OUT_FILE_NAME   "out.bin"
#define RW_DATA_NUM     (1)

void main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("L%d argc=%d\n", __LINE__, argc);
        printf("errno=%d %s\n", errno, strerror(errno));
        return;
    }

    // 読み込むファイルを開く
    char    *inFile = argv[1];
    FILE    *fpIn = fopen(inFile, "rb");
    if (fpIn == NULL)
    {
        printf("L%d fopen(%s) == NULL\n", __LINE__, inFile);
        printf("errno=%d %s\n", errno, strerror(errno));
        return;
    }

    // 書き込むファイルを開く
    FILE    *fpOut = fopen(OUT_FILE_NAME, "wb");
    if (fpOut == NULL)
    {
        printf("L%d fopen(%s) == NULL\n", __LINE__, OUT_FILE_NAME);
        printf("errno=%d %s\n", errno, strerror(errno));
        fclose(fpIn);
        return;
    }

    // 読み込むファイルのサイズを取得する
    struct stat inFileStat;
    if (stat(inFile, &inFileStat) != 0)
    {
        printf("L%d stat(%s) != 0\n", __LINE__, inFile);
        printf("errno=%d %s\n", errno, strerror(errno));
        goto FILE_CLOSE;
    }

    // ファイルを読み込んで書き出す
    for (long size = 0; size < inFileStat.st_size; size++)
    {
        unsigned char data;
        if (fread(&data, sizeof(data), RW_DATA_NUM, fpIn) < RW_DATA_NUM)
        {
            printf("L%d fread failed. size=%ld, st_size=%ld\n", __LINE__, size, inFileStat.st_size);
            printf("errno=%d %s\n", errno, strerror(errno));
            goto FILE_CLOSE;
        }
        if (fwrite(&data, sizeof(data), RW_DATA_NUM, fpOut) < RW_DATA_NUM)
        {
            printf("L%d fwrite failed. size=%ld, st_size=%ld\n", __LINE__, size, inFileStat.st_size);
            printf("errno=%d %s\n", errno, strerror(errno));
            goto FILE_CLOSE;
        }
    }

FILE_CLOSE:
    // ファイルを閉じる
    fclose(fpIn);
    fclose(fpOut);
}

モニターを2台接続したときに困ったこと

どうやって2台接続するか

PCにモニターを2台接続したいのだけど、HDMIポートが1つしかない。VGA(D-Sub(15pin))のポートがあるので、2台目はそれを使って接続することにした。

ちなみにUSB Type-CをHDMIに変換するアダプタも買ってみたけれど、PC側が対応していないかアダプタのドライバがWindows11に対応していないかで(多分前者)、認識されなかった。

しかしVGAのケーブルを買って接続してみると、解像度が低すぎて見るに堪えない。確認すると1024×768になっていて、それ以上には変更できない。VGAじゃ駄目なのかと思ってがっかりしていたところ、モニターを買ったときに付いてきたVGAケーブルを発見。何となくそれを挿してみると、1920×1080で表示された。ケーブルのせいだったのか・・・。そもそも買う必要がなかった。買ったケーブルは捨てた。

 

PCを再起動すると解像度が変わってしまう

期待通りに表示できるようになって良かったと思っていたけれど、PCを再起動すると1024×768に戻ってしまった。ケーブルを挿しなおすと1920×1080で表示されるけれど、毎回挿しなおすのでは面倒臭すぎる。

調べてみると、レジストリに解像度の設定があり、それらを全て削除してPCを再起動するか、設定値を変更すれば良いらしい。参考にしたのは以下の2つの記事。

https://news.mynavi.jp/article/windows-465/

https://mi.kobonemi.com/entry/ディスプレイON・OFFでウィンドウが小さくなる_2

初めにたどり着いたのが2つ目の記事で、こちらは編集する方法が書かれている。この記事のコメント欄にレジストリを削除すればよいと書かれていたので、さらに調べて1つ目の記事にたどり着いた。

最初は、レジストリを削除するのはちょっと怖かったので編集で済ませようとしたけれど、不要な設定が残るのも嫌だなと思いなおして、1つ目の記事を参考にレジストリを削除した。

これでやっと解決したかと思ったのもつかの間、「再起動」を選択して再起動すれば1920×1080で表示されたものの、シャットダウンしてから起動すると1024×768で表示されてしまった。(2つのレジストリ設定値の片方は1024×768になっていた。)

それで、結果的に実施したのは以下の手順。

 

1.以下のキーを全て削除

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥GraphicsDrivers¥Configuration

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥GraphicsDrivers¥Connectivity

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥GraphicsDrivers¥ScaleFactors

2.シャットダウン

3.VGAケーブルをモニターから抜く

4.電源ON

5.VGAケーブルをモニターに挿す

 

以上の手順を実施した後は、シャットダウン後起動しても1920×1080で表示できた。(レジストリの設定値も1920×1080になっていた。)

3,5の手順を入れた理由は、起動時にVGAで接続しているモニターの解像度がうまく認識できず、1024×768になってしまうようだったから。

 

2022/01/23追記:

PCをシャットダウン、起動するとVGAで接続しているモニターの解像度が1024×768になってしまう件は、その後時々再発し、解決していない。

VGAケーブルを挿しなおすと1920×1080で表示される。

今のところ、起動後にケーブルを挿しなおす以外に策がない。