【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19716

fscanfについて
投稿者---sanbo(2005/02/03 17:19:39)


for(i=0;i<20;i++){
        for(j=0;j<20;j++){
            fscanf(fp,"%d",&a[i][j]);
        }
    }


上記のようにして、ファイルの配列を読み込ませようとしたのですが
エラーになってしまいます。調べてみたら、スペースや改行をデータとして読み込んでしまうためらしいので、fscanfはあまり使わないらしいのですが
上記のような配列を読み込ませるにはどうすればよろしいのでしょうか?
fscanfのやり方も教えて下さい。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:fscanfについて 19717 あかま 2005/02/03 17:36:45


No.19717

Re:fscanfについて
投稿者---あかま(2005/02/03 17:36:45)


>上記のようにして、ファイルの配列を読み込ませようとしたのですが
>エラーになってしまいます。
どんなエラーですか?

>調べてみたら、スペースや改行をデータとして読み込んでしまうためらしいので、fscanfはあまり使わないらしいのですが
%dで指定しているときはスペースや改行は読み込みません。読み飛ばします。

>上記のような配列を読み込ませるにはどうすればよろしいのでしょうか?
>fscanfのやり方も教えて下さい。
読み込ませる配列とは、どのような入力データですか?
最低限それがないと説明できません。


この投稿にコメントする

削除パスワード

No.19718

Re:fscanfについて
投稿者---sanbo(2005/02/03 17:50:13)


すいません。エラーではなく、実行できるのですが、おそらく1行目だと
思うのですが、−168877535のような値が代入されています。
他の行はなんともなっておりません。
ファイルから読み込ませたいデータは以下のような20×20の二次元配列です。
 11111311100010120302
 11331135311111144445
 ・・・・・・・・・・・・・・・・・・・・
 ・・・・・・・・・・・・・・・・・・・・



この投稿にコメントする

削除パスワード

No.19719

Re:fscanfについて
投稿者---円零(2005/02/03 18:51:54)


ファイルは本当にその通りの内容なんですか?
全角という時点で読み込まれないような気がするんですが。
それと、区切りもないんでしょうか。


この投稿にコメントする

削除パスワード

No.19720

Re:fscanfについて
投稿者---sanbo(2005/02/03 18:59:34)


ファイルごとのせました。区切りやスペースはないと思うのですが・・・


22222330000033000003300000330000033000003300000330000033
22222330000033000003300000330000033000003300000330000033
22222330000033000003300000330000033000003300000330000033
00000332222233000003300000330000033000003300000330000033
00000332222233000003300000330000033000003300000330000033
00000332222233000003300000330000033000003300000330000033
00000330000033222223300000330000033000003300000330000033
00000330000033222223300000330000033000003300000330000033
00000330000033222223300000330000033000003300000330000033
00000330000033000003322222330000033000003300000330000033
00000330000033000003322222330000033000003300000330000033
00000330000033000003322222330000033000003300000330000033
00000330000033000003300000332222233000003300000330000033
00000330000033000003300000332222233000003300000330000033
00000330000033000003300000330000033222223300000330000033
00000330000033000003300000330000033222223300000330000033
00000330000033000003300000330000033000003322222330000033
00000330000033000003300000330000033000003322222330000033
00000330000033000003300000330000033000003300000332222233
00000339000033000003300000330000033000003300000332222233


この投稿にコメントする

削除パスワード

No.19722

Re:fscanfについて
投稿者---Craft(2005/02/03 19:22:51)


>ファイルごとのせました。区切りやスペースはないと思うのですが・・・

行数は20行ありますが、1行あたり54バイトしかないですね。
垂直方向は20行で大丈夫として、水平方向は20個の要素にどう読み込ませることを期待しているのでしょう?

区切りなしで n桁ずつ fscanf したいのであれば、
   fscanf( fp, "%05d", &n );
のようにすれば、5桁ずつ数値化することは可能ではありますが・・。

水平方向のデータ数不明、だとfscanfだけだと難しいと思います。


この投稿にコメントする

削除パスワード

No.19723

Re:fscanfについて
投稿者---sanbo(2005/02/03 19:39:04)


すいません。20×56の配列です。ごめんなさい。

>>区切りなしで n桁ずつ fscanf したいのであれば、
>>
   fscanf( fp, "%05d", &n );
のようにすれば、5桁ずつ数値化することは可能ではありますが・・。

私の最初の表記ミスからの返答かもしれませんが
なぜ5桁ずつなのですか?ということは、これを変えて
56桁ずつにしろということですか?






この投稿にコメントする

削除パスワード

No.19724

Re:fscanfについて
投稿者---HALLS(2005/02/03 21:13:51)


>なぜ5桁ずつなのですか?ということは、これを変えて

例えば5桁ずつならば、というくらいの意味合いだと思います。

ところで、コンピューターを使わずにくだんのファイルから
値を取得すると仮定したとき、どういった結果を得ることを
期待なさっていますか?
それを他の人に文章で説明できれば、その内容をソースコードに
落とし込むのはそれほど困難ではないような気がします。


この投稿にコメントする

削除パスワード

No.19727

Re:fscanfについて
投稿者---RAPT(2005/02/04 02:06:34)


サンプルプログラムはサンプルプログラムとして、鵜呑みにするのではなく、
自分のやりたい内容に落とし込む努力は必要です。

さて、数字を1型ずつ取り込みたいのなら、
fscanf(fp, "%1d", &a[i][j]);
といった具合になるかと思います。

いずれにしろ、どんな結果を求めているのかがみえないので
あなたが求める回答に直接結びつく確率は低いでしょう。

それから、ファイルの読み込みは、fgets() で1行読み込み、
sscanf()で読み込んだ文字列を解析するのが常套手段だと言われています。



この投稿にコメントする

削除パスワード

No.19728

Re:fscanfについて
投稿者---Craft(2005/02/04 13:04:33)


>例えば5桁ずつならば、というくらいの意味合いだと思います。

「たとえば」のくだりが抜けていましたね。
フォローありがとうございます。

ご指摘のとおりです。


この投稿にコメントする

削除パスワード

No.19729

Re:fscanfについて
投稿者---sanbo(2005/02/04 14:59:21)


すいません。もっと明確に記します。
ファイルから20行×56列の配列を読み込んで、1型ずつではなく
そのまま20行×56列の配列を読み込ませたいのです。
プログラム的には1型ずつという処理になるかもしれませんが・・・
またfgetsで1行ずつ読み込ませ、sscanfで文字列を解析するということは
fscanfでは出来ないということでしょうか?


この投稿にコメントする

削除パスワード

No.19730

Re:fscanfについて
投稿者---nop(2005/02/04 15:29:33)


>すいません。もっと明確に記します。
>ファイルから20行×56列の配列を読み込んで、1型ずつではなく
>そのまま20行×56列の配列を読み込ませたいのです。

全く明確になっていませんよ?
20行あるファイルデータを、どの様に配列に格納したいのですか?
具体例を挙げて見て下さい。


この投稿にコメントする

削除パスワード

No.19731

Re:fscanfについて
投稿者---sanbo(2005/02/04 15:49:09)


>>20行あるファイルデータを、どの様に配列に格納したいのですか?
>やりたいことを具体的に書きます。
 まず20行とは20人という意味です。56列とは56日という意味です。
 ファイルから20人の56日間分のシフト表を読み込ませたいのですが
 #19720に載せたファイルの20行8列目のように、勤務者が勤務できない
 日にちを「9」と書き込んだ後、ファイルを読み込ませ、プログラム上
 で操作していきたいのです。なので、どの様にというか20人分の56日間
 のシフト表みたくして読み込ませたいのです。うまい書き方がわからなくて
 すいません。うまく伝わったでしょうか?


この投稿にコメントする

削除パスワード

No.19734

Re:fscanfについて
投稿者---おでん(2005/02/04 17:03:16)


char buf[57] ;

for( r= 0 ; r < 20 ; r++ ){
    fgets(buf,sizeof buf, fp);
    for( c= 0 ; c < 56 ; c++ ){
        /* 一文字の処理 */
    }
}


説明するのなら、事実だけを書けばいいと思いますが・・・

・ファイには、20名のシフトの値が格納されている。
・各行は、社員(ぱーと?)一人分の56日間のシフト値が入っている。
・シフト一日の値は数字1文字で表され、行中に数字以外の文字は現れない。
(行末の改行は考えない)

例

22222330000033000003300000330000033000003300000330000033
22222330000033000003300000330000033000003300000330000033
22222330000033000003300000330000033000003300000330000033
00000332222233000003300000330000033000003300000330000033

「このような表があった場合、該当ファイルから(人、日を次元とした)
二次元配列に、各人・各日のシフト値を読み込みたいと思っている」

e.g.
 buf[0][0] == '2'
 buf[0][5] == '3'


・・・で、いいのかな?・・・違うことを言ってますか??


この投稿にコメントする

削除パスワード

No.19732

Re:fscanfについて
投稿者---円零(2005/02/04 16:21:16)


>すいません。もっと明確に記します。
>ファイルから20行×56列の配列を読み込んで、1型ずつではなく
>そのまま20行×56列の配列を読み込ませたいのです。
>プログラム的には1型ずつという処理になるかもしれませんが・・・
>またfgetsで1行ずつ読み込ませ、sscanfで文字列を解析するということは
>fscanfでは出来ないということでしょうか?

「1型ずつ」というのは恐らく「1桁ずつ」の打ち間違いかと思われますが…

「そのまま20行×56列の配列を読み込ませたい」とは具体的にどういう処理を指すのですか?
どう考えても、あなたがやりたい処理は、
1桁ずつ読み込んでそれぞれを配列の要素の一つに格納するもの、だとしか思えないのですが。


この投稿にコメントする

削除パスワード

No.19733

Re:fscanfについて
投稿者---sanbo(2005/02/04 16:58:34)


>>「そのまま20行×56列の配列を読み込ませたい」とは具体的にどういう処理を指すのですか?
>>どう考えても、あなたがやりたい処理は、
>>1桁ずつ読み込んでそれぞれを配列の要素の一つに格納するもの、だとしか思えないのですが。

>おっしゃるとおりです。それがしたいのですが、前に指摘された
「fgetsで1行ずつ読み込ませ、sscanfで文字列を解析する」の
やり方しかないですか?fgetsを使ったことがなかったので
fscanfでやりたかったのです。




この投稿にコメントする

削除パスワード

No.19735

Re:fscanfについて
投稿者---円零(2005/02/04 17:44:31)


いや、ですからRAPTさんが書いておられる通り
fscanf(fp, "%1d", &a[i][j]);
で良いのでは。





この投稿にコメントする

削除パスワード

No.19736

Re:fscanfについて
投稿者---sanbo(2005/02/04 17:54:16)


ありがとうございます。おっしゃるやり方で解決しました。




この投稿にコメントする

削除パスワード

No.19739

Re:fscanfについて
投稿者---一緒に悩んでみた(2005/02/04 18:16:33)


Cはじめて2ヶ月です。(正確には VC++6.0 ですが)
いやー、いい勉強させてもらいました(^o^)

/*一桁ずつ読み取る*/
int data[20][56];
for(ix=0;ix<20;ix++){
for(iy=0;iy<56;iy++){
fscanf( stream, "%1d", &data[ix][iy] );
}
}

/*一行ずつ読み取る*/
char data[20][56];
for(ix=0;ix<20;ix++)
fscanf( stream, "%s", data[ix] );

#スレ主さんへ
# fgets の方法もやってみましたか?


この投稿にコメントする

削除パスワード

No.19741

Re:fscanfについて
投稿者---一緒に悩んでみた(2005/02/04 18:32:50)


上のレス、インデント消えてますね… カッコワリィ

char data[20][58];
for(ix=0;ix<20;ix++)
  fgets( data[ix], sizeof(data[ix]), stream );

fgets の場合だと、\r\n の分も考慮しないと、
取得結果がグダグダになりますね。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧