fgetsとsscanfでファイル読み込み

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

fgetsとsscanfでファイル読み込み

#1

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

fgetsとsscanfでファイル読み込んでるのですがいくらやってもint hに整数値が入りません。。。
どこが悪いのか教えてください

コード:

# include<stdio.h>
#include "stdafx.h"
 #include <stdlib.h>
 #include <ctype.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 },
};
char hantei2[][ 256 ] =
{
	" ゲームプログラムを習得するための一番の近道はとにかく沢山プログラムを組む",
	"ことである。B" ,
	"@ プログラムの参考書にはゲームのプログラムの方法なんて何も書かれていない、B",
	"変数、B配列、B関数、Bループ、B条件分岐…Bこれらすべての説明はゲームで何に使うか",
	"なんてどこにも書いていない、Bせいぜい住所録を題材にした例がある程度である。B" ,
	"C プログラムは習うより慣れろなのでプログラムを組むに当たって少しでも知識が",
	"つけば後はそこからは掘り下げ、広げていけば良いわけで、Bプログラムの参考書を",
	"読んでいて少しでも何か出来るような気がしたらそこでとにかくプログラム",
	"を打ってみることが大事である。E",
} ;

char dainyuu[200] ="";


int loadscript(void)
{
int i, j=0,h=0;char c;
    FILE *fp = fopen("P33.txt", "r");
    if (fp == NULL) {
        printf("file open error!!\n");
        exit(EXIT_FAILURE);
    }

while ( fgets(dainyuu, 256, fp ) !=NULL)
{

sscanf(dainyuu,"@@start %s,%d", hantei2[j] , &h );
 printf("dainyuu%s",dainyuu); printf("h%d,",h);
j++;
}
    fclose(fp);
    return 0;
}
 
 
int main()
{int f = 0;char c;

    //初期化
for( int  i = 0 ; i <10; i ++ )
	{
	for( int  j = 0 ; j <256 ; j ++ )
		{
			hantei2[ i ][ j ] = 0 ;
						}
					}
loadscript();
for ( int i = 0; i <9; i++) {

          
    printf("↓hantei2[i]の値%s,", hantei2[i]); printf("\n");
    }

        return 0;
}


P33.txt↓

@@start あいうえお,12
@@start さしすせそ,65
@@start jhljhljh,548
@@start あああああ
@@start 三日月泰蔵
@@start polpolkun
@@start f79cdkutdctdxy

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

Re: fgetsとsscanfでファイル読み込み

#2

投稿記事 by nil » 13年前

インデントを整えてください

コンマ区切りの場合コンマも文字だと判断されます
なので%s,ではなく、%[^,]とします。
詳しくはWikipediaを見てください

気になった点としてはloadscriptの戻り値がint型であるにもかかわらず問答無用でexitをしていることです
メモリリークや解放忘れの危険があるため結構危険です

北見里

Re: fgetsとsscanfでファイル読み込み

#3

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

こんにちわ。
sscanf(dainyuu,"@@start %s%[^,]%d", hantei2[j] , &h );と変更したのですが
hには12と表示されるはずが10と表示されてしまいます

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

Re: fgetsとsscanfでファイル読み込み

#4

投稿記事 by non » 13年前

sscanf(dainyuu,"@@start %[^,],%d", hantei2[j] , &h );
ですよ。よく調べてね。
でも、あのP33.txtではうまくいかないよね。
non

北見里

Re: fgetsとsscanfでファイル読み込み

#5

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

@@start から,があるまでの間を放り込むんですね
なんとなくわかりました。
あと仕様を簡単にしてみてscanfのところを

sscanf(dainyuu,"%s,%d", hantei2[j] , &h );
にしてP33.txtを

あいうえお,12
さしすせそ,65
jhljhljh,548
@@start あああああ
@@start 三日月泰蔵
@@start polpolkun
@@start f79cdkutdctdxy

にして試してみたんですがまたしてもhに数が入りませんでした
なんでこうなるか教えてもらってもよろしいでしょうか?

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

Re: fgetsとsscanfでファイル読み込み

#6

投稿記事 by nil » 13年前

前述した通りあいうえお,12までを文字列としてプログラムは処理をします
なのでhに数字は入りません

コード:

while ( fgets(dainyuu, 256, fp ) !=NULL)
{
 
sscanf(dainyuu,"@@start %s,%d", hantei2[j] , &h );
 printf("dainyuu%s",dainyuu); printf("h%d,",h);
j++;
}
    fclose(fp);
    return 0;
}
そもそもこのコードでは
@@start 文字,数字
の場合にしか対応できませんよね?
@@start 文字
のみのような場合にも対応したい場合はそれ用にプログラムを書かなければなりません。

あと、わからないのならば、どこがどのようにわからないのかを説明していただければ他の回答者さんも答えやすいかと思います。
わからないのは次のうちどれですか?

1. scanf, sscanfの使い方
2. scanf, sscanfのエスケープシーケンス
3. %[^,]の意味
4. その他

北見里

Re: fgetsとsscanfでファイル読み込み

#7

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

>> 涼雅さん

正直sscanfの使いかたが分かりません。。。
一応カンマじゃなく空白で区切り文字にした場合sscanf(dainyuu,"%s%*c%d", hantei2[j] , &h );
でもhに数が読み込まれました
fscanfなら数字,数字,数字,・・・とあったら"%d%*c"でカンマ読み捨てることができたんですがsscanfはできないんですかね・・・・

北見里

Re: fgetsとsscanfでファイル読み込み

#8

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

一応解決しましたので
解決マークしときます

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

Re: fgetsとsscanfでファイル読み込み

#9

投稿記事 by nil » 13年前

最終コードの提示をお願いします。
数字,数字と続く場合はsscanfでも問題はありません。
問題なのは文字,数字であることです。
この場合%s,%dとした場合、
プログラムは
"文字,数字"というひとかたまりの文字列だと認識します。

↓此処から先には間違った情報が含まれるかもしれないと先に断っておきます。
それを回避するのが%[^,]という書き方で、
まず%[a]というのは'a'のみを文字列として認識し、それ以外は文字列として認識しない、というものです。
対して%[^a]は'a'『以外』を文字列として認識するつまり、sscanf( "Program", "%[^a]%s", Str1, Str2 );と文字列を読み込もうとしたら
Str1には"Progr"という文字列が、Str2には"am"という文字列がそれぞれ読み込まれます。
つまり、%[^,]はコンマまでを文字列として読み込む、という事です

北見里

Re: fgetsとsscanfでファイル読み込み

#10

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

なんかややこしそうなので並びを
文字(空白)数字,数字,数字・・・・・・にします
参考になりました。ありがとうございます

閉鎖

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