テキストファイルのデーターの読み込み

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
北見里

テキストファイルのデーターの読み込み

#1

投稿記事 by 北見里 » 12年前

こんにちわ。以前テキストファイルのデーターの読み込みについて質問させていただいたのですが
もう一度ご教授願いします

以下のコードを書くとテキストファイルのデーターを読み込んで整数に戻してint hantei[15][20]に
代入できたのですが、どうやらテキストファイルにある,(カンマ)も読み込まれてるみたいで
どうやってカンマを読み捨てて代入するかご教授おねがいします。(できればgetcをつかうやりかたで)

コード:

# include<stdio.h>
#include "stdafx.h"


#include <stdlib.h>
int hantei[15][20] = {
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int hantei2[20] = {};

int loadscript(void)
{
    FILE *fp;   /* (1)ファイルポインタの宣言 */
    char s[256];char k;
    int iNum=0;int i=0;
    /* (2)ファイルのオープン */
    /*  ここで、ファイルポインタを取得する */
    if ((fp = fopen("smpl.txt", "r")) == NULL) {
        printf("file open error!!\n");
        exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */
    }
    
    /* (4)ファイルの読み(書き)*/
    while (1) {

for (int v = 0; v < 20; v++) {
	//getcでテキストファイルにある文字の文字コードを読み取りiNum-'0で整数に戻してint hantei[i][v]に代入//
	//ファイルに,があると読み飛ばす//
    iNum=getc(fp);printf("%c",iNum);
	hantei[i][v]=iNum-'0';
	
	/*改行があれば次の要素へ  */
	if(iNum=='\n'){printf("改行");i++;}
}

        
     
 
 if(feof(fp))break;
    }
    fclose(fp); /* (5)ファイルのクローズ */

    return 0;
}


int main()
{int f = 0;
loadscript();
    
for (int i = 0; i<15; i++) {
for ( f = 0; f < 20; f++) {
    printf("%d", hantei[i][f]);} printf("\n");
    
}
        return 0;
}


↓smpl.txt
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1
1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1
1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: テキストファイルのデーターの読み込み

#2

投稿記事 by jay » 12年前

こんな感じかな?

コード:

for (int v = 0; v < 20; v++)
{
    //getcでテキストファイルにある文字の文字コードを読み取りiNum-'0で整数に戻してint hantei[i][v]に代入//
    iNum=getc(fp);

	//ファイルに,があると読み飛ばす//
	if(iNum==',')
		continue;
	
	printf("%c",iNum);
    hantei[i][v]=iNum-'0';
    
    /*改行があれば次の要素へ  */
    if(iNum=='\n'){printf("改行");i++;}
}
単純に , が来たらcontinueで処理をスキップさせてやればいいと思いますよ


余談ですが、インデントはキッチリした方がいいと思います
特に初心者はそれがキッチリしてないとバグを出しやすいですしね(苦笑)


誤字修正しました
最後に編集したユーザー jay on 2012年8月08日(水) 10:14 [ 編集 1 回目 ]
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

北見里

Re: テキストファイルのデーターの読み込み

#3

投稿記事 by 北見里 » 12年前

こんにちわ
if(iNum==',')
continue; ということでしょうか
変更しましたがfor (int i = 0; i<15; i++) {
for ( f = 0; f < 20; f++) {
printf("%d", hantei[f]);} printf("\n");

}がテキストファイルと同じ数値になりませんでした・・・

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: テキストファイルのデーターの読み込み

#4

投稿記事 by jay » 12年前

あっ、そうですね
ちょっと過去の自分のコード引っ張りっ出してきたので直すの忘れてましたね、すいません。
前の書き込みも直して置きました


そして上手くいかないって?
そりゃあそうだ、何せテキストは , を含めて1行に40文字あるんだから…

コード:

	for (int v = 0; v < 20; v++)
	{
		//getcでテキストファイルにある文字の文字コードを読み取りiNum-'0で整数に戻してint hantei[i][v]に代入//
		//ファイルに,があると読み飛ばす//
		iNum=getc(fp);

		//ファイルに,があると読み飛ばす//
	    if(iNum==',')
		{
			v--;
			continue;
		}

		printf("%c",iNum);
		hantei[i][v]=iNum-'0';

		/*改行があれば次の要素へ  */
		if(iNum=='\n')
		{
			printf("改行");
			i++;
		}
		if(feof(fp))
		{
			break;
		}
	}
これでどうでしょうか~?

そして上手くいかなかったのなら具体的にどういう風にダメだったのかも教えてくれるとうれしいですね
その方がこちらも考える手間が省けますので…
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

北見里

Re: テキストファイルのデーターの読み込み

#5

投稿記事 by 北見里 » 12年前

うーーん。ダメみたいですね・・・・
またしてもテキストと違う数値が出てきます↓


1-38111100000000000001
11-3811110000000000000
011-381111000000000000
1111-38111111111111111
11111-3811110000011111
111111-381111000001111
0000011-38111100000100
00100011-3811110000010
000100011-381111000111
0000100011-38111100000
00000000011-3811110000
000000000011-381111000
1111111111111-38111111
11111111111111-49-49-49-49-49-49

non
記事: 1097
登録日時: 13年前

Re: テキストファイルのデーターの読み込み

#6

投稿記事 by non » 12年前

改行のときには、これやったら駄目。
hantei[v]=iNum-'0';
non

nil
記事: 428
登録日時: 12年前

Re: テキストファイルのデーターの読み込み

#7

投稿記事 by nil » 12年前

改行の判定をする前に配列に代入していますからね。
代入の前に持ってきてはどうですか。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: テキストファイルのデーターの読み込み

#8

投稿記事 by jay » 12年前

コード:

#include <stdio.h>
//#include <stdafx.h>
#include <stdlib.h>


int hantei[15][20] =
{
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
	{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
 
int loadscript(void)
{
FILE *fp;   /* (1)ファイルポインタの宣言 */
int iNum=0;
int i=0;

	/* (2)ファイルのオープン */
	/*  ここで、ファイルポインタを取得する */
	if ((fp = fopen("smpl.txt", "r")) == NULL)
	{
		printf("file open error!!\n");
		exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */
	}

	/* (4)ファイルの読み(書き)*/
	while (1) 
	{
		for (int v = 0; v <= 20; v++)
		{
			//getcでテキストファイルにある文字の文字コードを読み取りiNum-'0で整数に戻してint hantei[i][v]に代入//
			iNum = getc(fp);
			printf("%c",iNum);

			//ファイルに,があると読み飛ばす//
			if(iNum==',')
			{
				v--;
				continue;
			}

			/*改行があれば次の要素へ  */
			if(iNum=='\n')
			{
				//printf("改行");
				i++;
				continue;
			}

			hantei[i][v]=iNum-'0';
		}
		if(feof(fp))
			break;
	}
	fclose(fp); /* (5)ファイルのクローズ */
	return 0;
}
 
 
int main()
{
	int f = 0;

	loadscript();
	printf("\n");    

	for (int i = 0; i<15; i++) 
	{
		for ( f = 0; f < 20; f++) 
		{
		    printf("%d", hantei[i][f]);
		}
		printf("\n");
	}
	return 0;
}
僕はこれで上手く行きました…
次からは他の人が見ても読みやすいコードを書いて下さいね
インデントはちゃんと整える、余計なモノは消しておく
これだけでも大分違読みやすくなると思いますよ
コードが読み易ければそれだけデバッグも楽になります

そうじゃないと今回みたいに問題がある所を見つけるのに必要以上に手間取ってしまいますので…


何がダメだったかというと
改行文字まで読み込んでしまっていたんですね
それでズレが生じてしまっていたと言うことです

あとは v < 20 でやると判定時に漏れが出ちゃうので
v <= 20に訂正しました


11:28 追記
ちょっと脱字があったので訂正しました
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

かずま

Re: テキストファイルのデーターの読み込み

#9

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

#include <ctype.h> で isdigit() を使ってもよいでしょう。

コード:

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

int hantei[15][20] = {
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};

int loadscript(void)
{
    int c, i, j;
    FILE *fp = fopen("smpl.txt", "r");
    if (fp == NULL) {
        printf("file open error!!\n");
        exit(EXIT_FAILURE);
    }
    for (i = 0; i < 15; i++) {
        for (j = 0; j < 20; j++) {
            do {
                c = getc(fp);
                if (c == EOF) {
                    printf("file read error!!\n");
                    exit(EXIT_FAILURE);
                }
            } while (c != '0' && c != '1');  // または !isdigit(c)
            hantei[i][j] = c - '0';
        }
    }
    fclose(fp);
    return 0;
}

int main()
{
    int i, j;
    loadscript();
    for (i = 0; i < 15; i++) {
        for (j = 0; j < 20; j++) {
            printf("%d", hantei[i][j]);
        }
        printf("\n");
    }
    return 0;
}

北見里

Re: テキストファイルのデーターの読み込み

#10

投稿記事 by 北見里 » 12年前

jayさんのコードでうまく表示されました
ありがとうございます^^

かずま

Re: テキストファイルのデーターの読み込み

#11

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

北見里 さんが書きました:jayさんのコードでうまく表示されました
jayさんのコードには、問題があります。hantei[v]=iNum-'0'; の後に
printf("hantei[%d][%d] = %d\n", i, v, hantei[v]); を追加するとわかりますが、
smpl.txt の最後に '\n' がない場合、
hantei[14][20] に (EOF - '0') を書きこもうとします。
smpl.txt の最後に '\n' がある場合、
hantei[15][0]~hantei[15][20]に (EOF - '0') を書きこもうとします。

閉鎖

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