早くも、翌日の宿題完遂が出来ず・・・
orz
というわけで、2日がかりながら、前回の宿題「二次元配列をファイルに書き出し、読み込むプログラムをCで書く」なんとか出来ました。
(お断り:データ入力時間短縮のため、二次元配列の大きさは、30×30から、10×10へ減らしました)
まず最初に書いたプログラムが、この二本。最初に、二次元配列にデータを入力し、ファイルに書き出すプログラム
-
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int x = 0;
int y = 0;
int data = 0;
int buf[10][10];
//buf初期化
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
buf[i][j] = 0;
}
}
//bufにデータ入力。xもしくはyに10以上の数値を入れると終了
while (x<10 || y<10) {
printf("x=");
scanf("%d", &x);
printf("\ny=");
scanf("%d", &y);
printf("\ndata=");
scanf("%d", &data);
printf("%d %d %d \n", x, y, data);
if (x < 10 && y < 10) {
buf[y][x] = data;
}
}
//入力したデータ表示
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%d ", buf[i][j]);
}
printf("\n");
}
getchar();//キーを押したらデータをファイルに書き出して終了。
getchar();//一つだけだと何故か効かないので、二つ並べてあります。
FILE *file;
file = fopen("test.dat", "wb");
fwrite(buf, sizeof(buf), 1, file);
fclose(file);
return 0;
}
-
次に、書き出したファイルを読み込み、正常に読み込めているか確認するために中身を表示するプログラム
-
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
int main(void)
{
int buf[10][10];//バイナリデータ置き場
//ファイルオープンと読み出し
FILE *file;
if (NULL == (file = fopen("test.dat", "r"))) {
printf("fopenできません\n");
exit(1);
}
fread(buf, sizeof(buf), 1, file);
//読み出した結果表示
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
printf("%d ", buf[i][j]);
}
printf("\n");
}
fclose(file);
getchar();
return 0;
}
-
しかしこれが上手くいかず、昨晩一晩潰したんですわ。ファイルの書き出しまでは、最初から上手くいってました。書き出し時の2次元配列の中身を表示させても、バイナリエディタで確認しても、ちゃんとintの4バイトでデータは正しく書き込まれてましたし。
しかし、読み込むとこの有様。
どうしたものかと頭をかかえたあげく、Twitter上に漂う謎の美少女、ターニャ・デグレチャフさん(仮名)に助けを求めたところ、「読み出し時のfopenで、バイナリが指定されてない」というご指摘が。
>if (NULL == (file = fopen("test.dat", "r"))) {
↑rしかないやん
あああ~!!なるほど!というわけで、本日仕事から帰宅後速攻で下記のようにbを追加し
>if (NULL == (file = fopen("test.dat", "rb"))) {
↑訂正後
実行したところ、見事ばっちりでございます!!
この勢いで本日は次段階の簡易マップエディタの完成までこぎつけたかったのですが、本日は野暮用がいくつかあり手がつけられず。時間的に中々難しいものです。やむを得ないので、明日の宿題!!
「今回作ったプログラムを発展させ、下記の仕様の簡易マップエディタを作る。」
・マウスオペレーション
・各マスに持たせるデータは1と0のみ
・広さは10×10マス
・セーブ、ロード機能を搭載させ、書き出しと読み込みを一つのプログラムに統合させる。
・DXライブラリ使用
まだまだ低空飛行ですが、出来るだけ早く、もっと多量のミッションを毎日こなせるように持って行きたいです。プログラム以外のこともやっていかねばならないし。
んでは、今日はこれにて・・・。