「C言語/ファイル入出力」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
同じファイルを重複して fopen() しているバグ多数。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
{{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合| Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、 : [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる] を無効にします。 }}
タグ: 2017年版ソースエディター
65 行
<code>#pragma warning(disable:4996)</code> が、fopenなどの関数の使用許可への指令である。これは、stdafx など一連のWindows用ヘッダのインクルードの後に指令する必要がある。
 
{{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合|
Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合は、
: [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる]
を無効にします。
}}
 
実際にWindows用のコードを書くと、下記のようになる。
71 ⟶ 76行目:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
#pragma warning(disable:4996)
80 ⟶ 84行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
 
fclose(fp1);
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
199 行
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
#pragma warning(disable:4996)
209 ⟶ 208行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
227 ⟶ 225行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
272 ⟶ 267行目:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
#pragma warning(disable:4996)
282 ⟶ 276行目:
if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
300 ⟶ 293行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
320 ⟶ 309行目:
 
このように、最初の1行(aaaaaaaaaaa)だけが読み取りされている。
 
 
 
 
329 ⟶ 316行目:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
#pragma warning(disable:4996)
339 ⟶ 325行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
345 ⟶ 330行目:
printf("ファイルをオープンしました。\n");
}
 
 
char str1[150];
358 ⟶ 342行目:
printf("ファイル2行目に書いてある文字列\n");
printf("%s\n", str1);
 
 
fclose(fp1);
printf("ファイルをクローズしました。\n");
 
 
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
407 ⟶ 386行目:
<syntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
 
int main()
415 ⟶ 392行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
436 ⟶ 412行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
return 0;
}
 
</syntaxhighlight>
 
471 ⟶ 443行目:
<syntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
 
int main()
479 ⟶ 449行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
500 ⟶ 469行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
return 0;
}
 
566 ⟶ 532行目:
<syntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
 
int main()
574 ⟶ 538行目:
if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように
perror("ファイルを開けませんでした。\n");
//system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
580 ⟶ 543行目:
printf("ファイルをオープンしました。\n");
}
 
 
char str1[150];
597 ⟶ 559行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
return 0;
}
</syntaxhighlight>
660 ⟶ 620行目:
<syntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
#include <string.h>
 
668 ⟶ 627行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
715 ⟶ 673行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
return 0;
}
</syntaxhighlight>
763 ⟶ 718行目:
<syntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
#include <string.h>
 
773 ⟶ 727行目:
if (fp1 == NULL) { // ここを読み取りモード"r"にするのを忘れないように
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
887 ⟶ 840行目:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
#pragma warning(disable:4996)
 
 
 
int main()
898 ⟶ 848行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
904 ⟶ 853行目:
printf("ファイルをオープンしました。\n");
}
 
char str1[150];
916 ⟶ 864行目:
fclose(fp1);
printf("ファイルをクローズしました。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
933 ⟶ 877行目:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
 
#pragma warning(disable:4996)
944 ⟶ 887行目:
//fclose(fp1); // ここでクローズするとエラー
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
962 ⟶ 904行目:
 
}
 
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
980 ⟶ 919行目:
fclose(fp1); // コメントアウトしないとエラーになる
system("pause");
return 1;
}
1,005 ⟶ 943行目:
// Linuxでエラーになる例
#include <stdio.h>
#include <stdlib.h> // Windowsでは「続行するには何かキーを押してください . . .」を表示するのに必要だった。
 
// #pragma warning(disable:4996) // Linux なので不要。未知の pragma は無視されるのでコメント化は必要ない
1,025 ⟶ 962行目:
printf("ファイルを閉じました。 \n");
printf("終了しています。 \n");
//system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
1,038 ⟶ 972行目:
// Linuxでエラーにならない例
#include <stdio.h>
#include <stdlib.h> // Windowsでは「続行するには何かキーを押してください . . .」を表示するのに必要だった。
 
// #pragma warning(disable:4996) // Linux なので不要だし、あるとエラーの原因になる
1,057 ⟶ 990行目:
 
printf("終了しています。 \n");
//system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
1,133 ⟶ 1,063行目:
// Linux用
#include <stdio.h>
#include <stdlib.h> // Windowsでは「続行するには何かキーを押してください . . .」を表示するのに必要だった。
 
// #pragma warning(disable:4996) // Linux なので不要だし、あるとエラーの原因になる
1,156 ⟶ 1,085行目:
printf("ファイルを閉じました。 \n");
printf("終了しています。 \n");
//system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 0;
}
</syntaxhighlight>
1,220 ⟶ 1,146行目:
<syntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」を表示するのに必要。
#include <string.h>
 
1,229 ⟶ 1,154行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
//system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
1,235 ⟶ 1,159行目:
printf("ファイルをオープンしました。\n");
}
 
char buffer1[150];
1,372 ⟶ 1,295行目:
if (fp1 == NULL) {
perror("ファイルを開けませんでした。\n");
system("pause");// 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
1,512 ⟶ 1,434行目:
#include <stdio.h>
#include <locale.h>
#include <stdlib.h> // 「続行するには何かキーを押してください . . .」
 
#pragma warning(disable:4996)
1,524 ⟶ 1,445行目:
wprintf(L"ファイルを開けませんでした。\n");
perror(0);
system("pause"); // 「続行するには何かキーを押してください . . .」の待機命令
return 1;
}
1,544 ⟶ 1,464行目:
fclose(fp1);
wprintf(L"ファイルをクローズしました。\n");
 
 
system("pause"); // 「続行するには何かキーを押してください . . .」
return 0;
}
 
</syntaxhighlight>
 
 
 
1,562 ⟶ 1,475行目:
また、このことから、Windowsの自称する「Unicode」が、実際の国際規格とは実態が違っていることが分かる。
 
== 機械語での読み書き ==
別ページ『[[機械語]]』(wikibooks内)で、C言語での機械語の読み書きのしかたを説明してある。
 
 
== 画像ファイルなどの生成をしたい場合 ==
{{-}}
[[File:Bitmap structure on hex edit japanese.svg|thumb|900px|バイナリエディタで見た場合のビットマップの機械語の配置<br>バージョンによって少々異なる場合もあるが、おおむね、こういう感じである。]]
{{-}}
 
たとえばビットマップ画像を作りたい場合、
 
機械語で、いわゆる「ビットマップ構造体」の仕様で決められた様式で、機械語をファイルに書き込む。
 
すると、たいていのデスクトップ用OS(ウィンドウズも含む)では、ビットマップ形式の機械語をサポートしているので、その機械語を画像ファイルとして認識してくれるので、クリックなどをするとOSが画像表示などをしてくれる。
 
なお、ネットや専門書の解説では画像フォーマットの仕様を説明するためによくC言語の「構造体」の書式が説明されるが、しかし、その構造体を入力しても、画像は生成されない。
 
 
 
さて、たとえば何らかのビットマップ画像をバイナリエディタで読み込むと、ファイルの先頭は必ず「42 4D」という16進数である。この数字は、アスキーコードで翻訳すると「BM」になる。
 
この「42 4D」という冒頭の数字を識別子とすることで、ファイルの種類を認識している。
 
誤解しないでほしいが、けっして「BM」と機械語で書かれているのでなく(そもそも十六進数に「M」は無い)、書かれているのは あくまで「42 4D」である。
 
ネット検索で調べる場合は「42 4D」というキーワードを付け加えて「ビットマップ 42 4D」などで調べれば、ビットマップ画像のバイナリでの扱いに関する有益な情報が入手しやすいだろう。
 
wikibooksでの解説なら、詳しくは別ページ『[[機械語]]』で説明する予定(※ 2019年12月20日の時点では未記述)。完成までは、ウィキペディア [[w:Windows bitmap]] なども参照されたし。
 
[[カテゴリ:C言語]]