ページ 11

文字列の代入が出来ません

Posted: 2015年1月23日(金) 22:46
by Tangeθ
いつもお世話になっております。
かなり、基礎の部分と思われるのですが、つまづいてしまったため、質問させて頂きました。
DXライブラリでテキストを読み込む際、たとえば、
11,20,33
という記述のある文章を、まず、char String[100]に代入。
次に’,’で区切って小分けにして、char StringTwo[100]に、11、20、33と順々に代入する処理でつまづいてしまいました。

その時に、
StringTwo[x’]=String[x]
のような処理を行っているのですが、なぜか途中から何も代入されなくなってしまいました。

以下がソースです。
”この行の代入処理で失敗している”が、代入に失敗している箇所ですので、CTRL+Fでご覧下さい。

コード:

#define READ_SIZE_MAX 500

int FileHandle = FileRead_open( "dat/情報/キャラ番号表.txt" ) ;
char String[READ_SIZE_MAX],miniString[10]="" ;
int fileCnt=0;
int moziX=0,miniMoziX=0;
while( FileRead_eof( FileHandle ) == 0 )// ファイルの終端に行っていない間動作する
{
	FileRead_gets( String, READ_SIZE_MAX, FileHandle ) ;
	if(String[0]=='/'&&String[1]=='/' || String[0]=='\0')
	{
		FileRead_seek( FileHandle, 0, SEEK_CUR ) ;
		continue;	// コメント文だったら、次の行に移ってからループを再開
	}
	moziX=0;fileCnt=0;miniMoziX=0;
	//while()	// 文字を' 'がくる度、miniString[10]に分割して代入、
	while(String[moziX]!='\0')
	{
		if(String[moziX]==' ')
		{
			switch(fileCnt)
			{
			default:
				if(fileCnt<10)
				printfDx("No %d %s\n",fileCnt,miniString);
				break;
			}
			fileCnt++;miniMoziX=0;for(int i=0;i<10;i++)miniString[i]='\0';//sprintf(miniString,"");
			
		}
		else
		{
			if(fileCnt<10)
				printfDx("%c",String[moziX]);	// ここまでは、出来てる(半角1文字ずつ描画しているので、文字化けはするが・・・)
			miniString[miniMoziX]=String[moziX];miniString[miniMoziX+1]='\0';	// この行の代入処理で失敗している。なぜ?仕様?
		}
		moziX++;miniMoziX++;
	}
	// それぞれのcharimg_tの情報に代入する処理を挟む
	//printfDx("%s\n",String);
	FileRead_seek( FileHandle, 0, SEEK_CUR ) ;
}
FileRead_close( FileHandle ) ;
以下が、読み込みするテキストファイルです

コード:

//*参照例
//ID 0=ああああ。ID0のモーション0番目の0フレーム目の画像が"ああああ_00_0000.png"

// ファイル番号、モーション総数、ファイル名、各モーションのフレーム数(連番画像の終番+1) ...
// 00 61 ああああ 53 53 ....

000 61 ああああ 53 53 41 41 9 9 21 21 21 21 21 21 21 21 16 16 16 16 51 51 51 51 11 11 11 11 8 8 8 8 11 9 9 9 9 9 9 9 9 6 6 6 6 11 11 11 11 7 7 7 7 16 16 16 16 1 1 1 1 53 53
001 61 いいいい 53 53 41 41 9 9 21 21 21 21 21 21 21 21 16 16 16 16 1 1 1 1 11 11 11 11 8 8 8 8 11 9 9 9 9 9 9 9 9 6 6 6 6 11 11 11 11 7 7 7 7 16 16 16 16 1 1 1 1 53 53
002 61 うううう 53 53 41 41 9 9 21 21 21 21 21 21 21 21 16 16 16 16 1 1 1 1 11 11 11 11 8 8 8 8 11 9 9 9 9 9 9 9 9 6 6 6 6 11 11 11 11 7 7 7 7 16 16 16 16 1 1 1 1 53 53
003 61 ええええ 53 53 41 41 9 9 21 21 21 21 21 21 21 21 16 16 16 16 1 1 1 1 11 11 11 11 8 8 8 8 11 9 9 9 9 9 9 9 9 6 6 6 6 11 11 11 11 7 7 7 7 16 16 16 16 1 1 1 1 53 53

Re: 文字列の代入が出来ません

Posted: 2015年1月23日(金) 23:10
by Tangeθ
すいません。自己解決しました。
一応、ソースを載せておきます。
ただ、全くもってスマートでない方法です。ご了承ください。

コード:

int FileHandle = FileRead_open( "dat/情報/キャラ番号表.txt" ) ;
char String[READ_SIZE_MAX],miniString[10]="" ;
int fileCnt=0;
int moziX=0,moziXStart=0;
while( FileRead_eof( FileHandle ) == 0 )// ファイルの終端に行っていない間動作する
{
	FileRead_gets( String, READ_SIZE_MAX, FileHandle ) ;
	if(String[0]=='/'&&String[1]=='/' || String[0]=='\0')
	{
		FileRead_seek( FileHandle, 0, SEEK_CUR ) ;
		continue;	// コメント文だったら、次の行に移ってからループを再開
	}
	moziX=0;fileCnt=0;moziXStart=0;
	//while()	// 文字を' 'がくる度、miniString[10]に分割して代入、
	while(String[moziX]!='\0')
	{
		if(String[moziX]==' ')
		{
			switch(fileCnt)
			{
			default:
				if(fileCnt<10)
				printfDx("No %d %s\n",fileCnt,miniString);
				break;
			}
			fileCnt++;moziXStart=moziX+1;for(int i=0;i<10;i++)miniString[i]='\0';//sprintf(miniString,"");
			
		}
		else
		{
			//miniString[miniMoziX]=String[moziX];miniString[miniMoziX+1]='\0';	// この行の代入処理で失敗している。なぜ?仕様?
			sprintf(miniString,"%c%c%c%c%c%c%c%c%c",String[moziXStart],
				String[moziXStart+1],String[moziXStart+2],
				String[moziXStart+3],String[moziXStart+4],
				String[moziXStart+5],String[moziXStart+6],
				String[moziXStart+7],String[moziXStart+8]);
			miniString[moziX-moziXStart+1]='\0';
		}
		moziX++;
	}
	// それぞれのcharimg_tの情報に代入する処理を挟む
	//printfDx("%s\n",String);
	FileRead_seek( FileHandle, 0, SEEK_CUR ) ;
}
FileRead_close( FileHandle ) ;

Re: 文字列の代入が出来ません

Posted: 2015年1月25日(日) 11:11
by かずま
Tangeθ さんが書きました: ただ、全くもってスマートでない方法です。ご了承ください。

コード:

        FileRead_seek( FileHandle, 0, SEEK_CUR ) ;
読み取り位置を現在位置(CUR)から 0バイト先へ移動(seek)。無意味です。

コード:

            switch(fileCnt)
            {
            default:
                if(fileCnt<10)
                printfDx("No %d %s\n",fileCnt,miniString);
                break;
            }
fileCnt の値に無関係に default: に行きます。無意味です。

strtok() を使えばよいのでは?

コード:

#include <string.h> // strtok

    char String[500], miniString[100];
    int FileHandle = FileRead_open("dat/情報/キャラ番号表.txt");
    if (FileHandle == 0) return 1;
    while (FileRead_gets(String, sizeof String, FileHandle) != -1) {
        if (String[0]=='/' && String[1]=='/' || String[0]=='\0')
            continue; // コメントだったら、次の行
        char *p = strtok(String, " \n");
        for (int fieldCnt = 0; fieldCnt < 10 && p; fieldCnt++) {
            strcpy(miniString, p);
            printf("No %d %s\n",fieldCnt, miniString);
            p = strtok(NULL, " \n");
        }
    }
    FileRead_close(FileHandle);