今日も躓く

メモメモ

Windows10で設定の「回復」をクリックするとウィンドウがすぐに閉じて初期化できない時

Windows 10のPCを工場出荷時の状態に戻したかったのですが、なぜか「設定」から「回復」をクリックすると、すぐにウィンドウが閉じてしまう現象に見舞われていました。

どこかプログラムに不具合があると思い、Power Shellを管理者権限で開き、sfc /SCANNOWを実行すると、いくつか問題があるものの修正まではできない状態でした。

色々ググるとコマンドで初期化できました。 参考サイト

% systemreset --factoryreset

ワーキングディレクトリに.clang-formatを置いているのに設定が反映されない (VS Code)

表題の通り、clang-formatでフォーマットはできるが、.clang-formatの内容が反映されていない問題が発生しました

なんか色々ググったり調べたりしてもわからなかったんですが、settings.jsonを修正するとうまくできました

vscode clang format settingsなどでググると、"clang-format.style": "google"を設定するサイトが結構ヒットすると思います これをコメントアウトすると、ワーキングディレクトにある.clang-formatの設定が反映されました どうやらこれを設定していると、設定したスタイルが最優先されるみたいですね 個人的には.clang-formatを最優先した方が良いんではないかとは思うんですけどね

{

  ...

  // "clang-format.style": "google",

  ...

}

C++98でファイルを一気に読み取りたい時

事情がありC++98でファイルを一気に読み取りたい時にちょっと困ったのでメモしておきます。

 

普通に"how to read file in cpp"とかでググると、ifstreamでファイルを開き、getlineで一行ずつ読み取る方法が出てきます。ただ、これで読み取ると改行までを読み取り、改行はスキップされるので、例えば改行がないファイルを読み取った時に最後に改行があるかどうかがわからない気がします(もしできたら教えてください)。

 

そこで、"how to read file with newline in cpp"とかでググったんですが、そこまで良い方法にヒットしませんでした。C++98ではできないのかと半ば諦め気味でしたが、ググり続けた結果、filestreamからstringstreamに文字列を吐き出す方法にたどり着けました。

 

std::ifstream ifs(filepath); // filepath : ファイルのパス
std::stringstream ss;
ss << ifs.rdbuf();
ss.str();

 

あと、ディレクトリが渡されたらエラーとしたい時はあると思います。しかし、ifstreamで読み込んだ時はおそらく判定方法がありません(もしできたら教えてください)。ググっても出てきませんでした。試行錯誤した結果、fstreamで読み込み、rdstateでビットパターンをチェックすれば良いとわかりました。

 

std::fstream ifs(path);
if (ifs.rdstate() != 0) { // 失敗したら0以外の値が返ってくる
std::cerr << "Error: Failed to open file" << std::endl;
std::exit(1);
}

 

ただ、rdstateだとファイルの権限がない時とディレクトリが読まれた時、両方とも同じ値が返ってくるので、そのケースでは使えません。もっと良い方法を知っている方は教えていただけると嬉しいです。

 

それでは