txtファイルからデータを格納したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

txtファイルからデータを格納したい

#1

投稿記事 by wasawasa » 11年前

「001-G_Water01,0,4」という文が18行並んでいるtxtファイルから文を読み込み、「001-G_Water01」という半角英数字で構成された文字列のデータと「0」「4」という数値のデータを変数に格納したいと思い、龍神録の講座の内容を参考に下記のような記述を組んで3種類のデータを読み込み表示させたところ、読み込んだ数値のデータに異常は無かったのですが文字列のデータが変な風に格納されてしまったらしく、文字化けしてしまいました。
一体何故読み込んだ文字列は破損してしまったのでしょうか?どうしたら正常に読み込むことができるのでしょうか?どなたかよろしくお願いします。

記述

コード:

#include "DxLib.h"
#include "TileDataFrame.h"
struct ATileData{
	int pics[4][48];//
	int pri;//
	int pat;//
};
struct ATileData ATile[18];
void ATile_ini(){
    int file,i,n=0,m=0,ed=0;
    int text[32];
    char textc[32];
    file = FileRead_open( "./Project/Data/Txt/ATileData.txt" ) ;
    if(file==NULL){printfDx("read error\n");return;}
    while(1){
        for(i=0;i<32;i++){
            text[i] = FileRead_getc(file);
            textc[i] = text[i];
            if(text[i]==',' || text[i]=='\n'){textc[i]='\0';break;}
            if(text[i]==EOF){ed=1;break;}
        }
        if(ed==1){FileRead_close(file);break;}
        switch(m){
			case 0: 
				for(i=0;i<32;i++){
					ATile[n].name[i]= textc[i];
				}break;
            case 1: ATile[n].pri = atoi(textc);break;
            case 2: ATile[n].pat = atoi(textc);break;
        }
        m++;
        if(m==3){m=0;n++;}
    }
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE); // ウィンドウモードに設定
        DxLib_Init();   // DXライブラリ初期化処理
		int i;
		ATile_ini();
		for(i=0;i<18;i++){
			DrawFormatString( 0, i*20, GetColor(255,255,255), "[%c,%d,%d]",ATile[i].name, ATile[i].pri, ATile[i].pat);
		}


        WaitKey();      // キー入力待ち
        DxLib_End();    // DXライブラリ終了処理
        return 0;
}

box
記事: 2002
登録日時: 14年前

Re: txtファイルからデータを格納したい

#2

投稿記事 by box » 11年前

そもそも、そのコードはコンパイルが通りますか?
wasawasa さんが書きました:

コード:

struct ATileData{
	int pics[4][48];//
	int pri;//
	int pat;//
};
struct ATileData ATile[18];
					ATile[n].name[i]= textc[i];
			DrawFormatString( 0, i*20, GetColor(255,255,255), "[%c,%d,%d]",ATile[i].name, ATile[i].pri, ATile[i].pat);
メンバーnameが、構造体定義の中に見当たらないように見えます。

また、本題とは外れますが、{ と } とが同じ行にあるようなコードは見づらくて…。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: txtファイルからデータを格納したい

#3

投稿記事 by みけCAT » 11年前

26行目と41行目が矛盾しているように感じます。
ATile.nameの型をcharと仮定すると26行目でコンパイルエラーになり、
ATile.nameの型をchar[32]と仮定すると41行目の基準が不自然です。

【追記】ATile[n].nameに格納されたデータをデバッガで直接確認してみるといいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: txtファイルからデータを格納したい

#4

投稿記事 by box » 11年前

こんな風にいいかげんなコードを書いてみて

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    FILE *fp;
    int m, n, i;
    char s[40], *p, *dlm = ",";
    
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "open error.\n");
        exit(1);
    }
    
    for (i = 0; i < 18; i++) {
        fgets(s, sizeof(s), fp);
        s[strlen(s) - 1] = '\0';
        p = strtok(s, dlm);
        printf("%s ", p);
        p = strtok(NULL, dlm);
        m = atoi(p);
        printf("%d ", m);
        p = strtok(NULL, dlm);
        n = atoi(p);
        printf("%d\n", n);
    }
    
    fclose(fp);
    return 0;
}
こんなテキストファイルを食わせると

コード:

001-G_Water01,1,2
001-G_Water02,3,4
001-G_Water03,5,6
001-G_Water04,7,8
001-G_Water05,9,10
001-G_Water06,11,12
001-G_Water07,13,14
001-G_Water08,15,16
001-G_Water09,17,18
001-G_Water10,19,20
001-G_Water11,21,22
001-G_Water12,23,24
001-G_Water13,25,26
001-G_Water14,27,28
001-G_Water15,29,30
001-G_Water16,31,32
001-G_Water17,33,34
001-G_Water18,35,36
何となくそれらしい結果を得ます。

コード:

001-G_Water01 1 2
001-G_Water02 3 4
001-G_Water03 5 6
001-G_Water04 7 8
001-G_Water05 9 10
001-G_Water06 11 12
001-G_Water07 13 14
001-G_Water08 15 16
001-G_Water09 17 18
001-G_Water10 19 20
001-G_Water11 21 22
001-G_Water12 23 24
001-G_Water13 25 26
001-G_Water14 27 28
001-G_Water15 29 30
001-G_Water16 31 32
001-G_Water17 33 34
001-G_Water18 35 36
質問者さんが本当にこういうことをお望みなのかどうかは、わかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: txtファイルからデータを格納したい

#5

投稿記事 by かずま » 11年前

DxLib には、FileRead_scanf があるようなので、
stdio の fscanf と同様に使えるのでは?

コード:

#include <stdio.h>

struct ATileData{
    int name[48];
    int pri;
    int pat;
};
struct ATileData ATile[18];

int ATile_ini()
{
    int i;
    FILE *fp = fopen("ATileData.txt", "r");
    if (fp == NULL) return puts("read error"), 0;
    for (i = 0; i < 18 && fscanf(fp, " %47[^,],%d,%d",
        ATile[i].name, &ATile[i].pri, &ATile[i].pat) == 3; i++) ;
    fclose(fp);
    return i;
}

int main(void)
{
   int i, n = ATile_ini();
   for (i = 0; i < n; i++)
       printf("[%s,%d,%d]\n", ATile[i].name, ATile[i].pri, ATile[i].pat);
   return 0;
}

かずま

Re: txtファイルからデータを格納したい

#6

投稿記事 by かずま » 11年前

かずま さんが書きました:

コード:

    int name[48];
訂正します。

コード:

    char name[48];

wasawasa
記事: 94
登録日時: 11年前

Re: txtファイルからデータを格納したい

#7

投稿記事 by wasawasa » 11年前

>>boxさん、みけCATさん
記述の3~7行目のコピーを間違えていたみたいです。正しくは

コード:

struct ATileData{
	int pics[4][48];//
	int pri;//
	int pat;//
	char name[32];//画像名
};
でした。すみません。

そしてboxさんとかずまさんの記述を見て41行目の"[%s,%d,%d]"を"[%c,%d,%d]"と間違えていた事に気づき、試してみたら正常に表示されました。
お騒がせして大変申し訳ございませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る