![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
拡張子をtxtファイルと、binファイルの両方で試したのですが同じように文字化けします。
ファイルの読み込み方が悪いのでしょうか?
読み込むファイル char_data.txt
Alice 1 15 10 8
Slime 1 10 8 3
Skeleton 2 15 11 7
Ghost 3 20 14 10
Dragon 100 3000 3000 300
//----------------------------------------------------
//ソース全文
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#define N 5
typedef struct gamechar{
char name[32];
int lv;
int hp;
int mp;
int atk;
}GC;
void file_read(GC gc[]);
void status(GC pc, GC mc[], GC mc_copy[], int *num, int *lot);
void mons_change(GC pc, GC mc[], int *num);
void mons_multi(GC mc[], GC mc_copy[], int *num, int *lot);
int main(void)
{
int num=0, lot=0; //モンスターの種類選択用、複数作成用
GC gc[N];
GC pc; //プレイヤーキャラ用
GC mc[N]; //モンスター用
GC mc_copy[N]; //モンスターを複数作成する時用
srand((unsigned)time(NULL));
file_read(gc);
//ファイルデータ読み込み終了
memcpy(mc, gc, sizeof(gc));
pc=mc[0]; //mc[0]はプレイヤーキャラ
mons_change(pc, mc, &num);
mons_multi(mc, mc_copy, &num, &lot);
status(pc, mc, mc_copy, &num, &lot);
return 0;
}
void mons_multi(GC mc_copy[], GC mc[], int *num, int *lot)
{
*lot=rand()%5;
for(int i=0; i<(*lot); ++i){
mc_copy[i]=mc[*num];
}
}
//モンスターランダム切り替え
void mons_change(GC pc, GC mc[], int *num)
{
*num=rand()%N; // モンスターの種類を変える
}
//データファイル読み込み
void file_read(GC gc[])
{
FILE *fp;
int i=0;
if(fopen_s(&fp, "char_data.txt", "r")!=0){
exit(EXIT_FAILURE);
}
while(fscanf_s(fp,"%s%d%d%d%d", gc[i].name, _countof(gc[i].name), &gc[i].lv, &gc[i].hp, &gc[i].mp, &gc[i].atk)!=EOF){
++i;
}
fclose(fp);
}
// ステータス表示
void status(GC pc, GC mc[], GC mc_copy[], int *num, int *lot)
{
system("cls");
// printf("num 0:player_char 1:Slime 2:Skeleton 3:Ghost 4:Dragon\n\n");
puts("--------------------------------------------");
printf(" Lv%-4d%-16sHP%-10dMP%-10d\n", pc.lv, pc.name, pc.hp, pc.mp);
puts("");
printf(" %-36s%-1d匹\n", mc[*num].name, *lot);
puts("--------------------------------------------");
for(int i=0; i<(*lot); ++i){
printf(" %-37s%-1d\n", mc_copy[*num].name, i);
}
}
![「テキストファイルから読み込んだ文字が文字」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/5/528383950_579998d85cce7/M.png)
No.5ベストアンサー
- 回答日時:
GC mc[N] = { //モンスター用
{ "m0", 0, 0, 0, 0 },
{ "m1", 0, 0, 0, 0 },
{ "m2", 0, 0, 0, 0 },
{ "m3", 0, 0, 0, 0 },
{ "m4", 0, 0, 0, 0 }
};
GC mc_copy[N] = { //モンスターを複数作成する時用
{ "mc0", 0, 0, 0, 0 },
{ "mc1", 0, 0, 0, 0 },
{ "mc2", 0, 0, 0, 0 },
{ "mc3", 0, 0, 0, 0 },
{ "mc4", 0, 0, 0, 0 }
};
こんな感じにしておくと…少なくとも「未初期化のローカル変数」参照で文字化け(ゴミ)が表示されることはなくなるかと思いますよ。
memset()で構造体配列を0x00埋めしてしまう。というのも有りかもしれませんが。
ただし、その場合は
>printf(" %-37s%-1d\n", mc_copy[*num].name, i);
などで表示される文字列はなにもなし…になりますけどね。
No.3
- 回答日時:
>何度か実行すると、やはり文字化けしてしまいます。
デバッグは自分でやってほしいところですが……。
>for(int i=0; i<(*lot); ++i){
> printf(" %-37s%-1d\n", mc_copy[*num].name, i);
>}
ループでぐりぐり回る(変化する)のはiです。
名前(?)の表示は第宇引数で渡された値です。
第4引数で渡される値は第5引数で渡される値より小さいことが保証されていますか?
No.2
- 回答日時:
>ファイルの読み込み方が悪いのでしょうか?
ファイルから読み込んだ内容を捨てているからでは?
>file_read(gc);
で、gc[]に読み込みます。
>memcpy(mc, gc, sizeof(gc));
で、gc[]の内容をmc[]にコピーします。
>mons_multi(mc, mc_copy, &num, &lot);
で、未初期化のmc_copy[]をmc[]にコピーします。
>status(pc, mc, mc_copy, &num, &lot);
で、未初期化のmc_copy[]を表示しようとします。
>printf(" %-37s%-1d\n", mc_copy[*num].name, i);
の部分ね。
関数に渡す変数と、関数側で受け取って使っている仮引数の名前に注意するべきでしょう。
>mons_multi(mc, mc_copy, &num, &lot);
では、第1引数はmc[]、第2引数はmc_copy[]で渡しています。
が、受け取る
>void mons_multi(GC mc_copy[], GC mc[], int *num, int *lot)
では、第1引数がmc_copy[]で第2引数がmc[]です。
処理内容により、mc[]からmc_copy[]にコピーされます。
つまり、mons_multi()の中では下記の対応になります。
mc_copy[] => main()のmc[]
mc[] => main()のmc_copy[]
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで改行の入ったデータの正規...
-
四角形の端っこをドラッグした...
-
photoshopで書いた四角の枠の中...
-
python ボタンを押すと複数の関...
-
VBSでMid関数を使ったらエラー...
-
テキストボックスにセルの値を...
-
C言語でネットワーク範囲のIPア...
-
ゲージと連動したムービークリ...
-
五芒星は、悪魔崇拝とどういう...
-
DelphiのRichEditでカーソル位...
-
【VB.NET】別Formのボタンが押...
-
貴方の意見を聞かせてください!
-
UWSCのBTN関数について。
-
Action Script2.0で開発してます。
-
DataTableの件数を取得したい
-
変数に256文字以上のテキストを...
-
ムービー上で入力した値の送信...
-
シンボル化解除の方法
-
Fireworks4の写真の切り取り方...
-
マウスクリックした回数がカウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで改行の入ったデータの正規...
-
VBAユーザーホームテキストボッ...
-
ActionScript3.0の修正に関して
-
四角形の端っこをドラッグした...
-
Flashで外部jpgファイルをmcに...
-
ActionScript3のMovieClipについて
-
FLASHでスロットゲームを作りた...
-
ステージの背景画像のみ拡大縮...
-
ダイナミックテキストを印刷す...
-
ラッコって?
-
テキスト入力
-
テキストファイルから読み込ん...
-
マウスホイールでムービークリ...
-
Flashにて画像がスクロール
-
マウスが押されているのか(DOWN...
-
tweenerを使ったスライドショー
-
以下のActionScriptをスッキリ...
-
縦横比率のを変えずに画像のサ...
-
AS3.0 Timerの使い方
-
ピクチャーコントロールのデバ...
おすすめ情報
ありがとうございます。
残念ながら、メモ帳からANSIを選んで保存しても同じでした。
他のテキストエディタ”Notepad++、CresentEve、Visual Stadio Codeなど”でシフトJISを選択して保存しても同じでした。
また、何かわかりましたらよろしくお願いします。
ありがとうございます。
早速見直して、実行してみました。
void status(GC pc, GC mc[], GC mc_copy[], int *num, int *lot);
void mons_change(GC pc, GC mc[], int *num);
void mons_multi(GC mc_copy[], GC mc[], int *num, int *lot);
status(pc, mc, mc_copy, &num, &lot);
mons_change(pc, mc, &num);
mons_multi(mc_copy, mc, &num, &lot);
変更後、文字化けせずに読み込めるようになりましたが、完全ではありませんでした。
何度か実行すると、やはり文字化けしてしまいます。
また何かわかりましたら、よろしくお願いします。
初期化の説明を参考にいろいろやってみた結果、これで解決できました。
memcpy(mc, gc, sizeof(gc));
memcpy(mc_copy, gc, sizeof(gc));
memcpyで両方ともやってみたら、文字化けしなくなりました。
ありがとうございました。