今、ファイルから1文字ずつ文字を取得して
intに格納するプログラムを作っているのですが
うまくいきません。
char name[300];
char moji[300];
fp=fopen(name,r);
strcpy(name, ");
int i,j;
for (i=1;i<=15;i++)
{
fscanf(fp,%s,moji);
strcpy(name, " );
strcat(name, moji);
for (j=1;j<=20;j++)
{
map1.map[j+(i*15)]=atoi(moji)
//map1.map[300]<-int型変数
}
}
fclose(fp);
とやっているのですがうまくいきません。
何かいい方法はないのでしょうか?
またatoiで変換した文字は、
文字 ”0”
だったら、
数字 ”0”
になるのでしょうか?
>うまくいきません。
どううまくいかないのですか? このソース、パッと見、
>map1.map[j+(i*15)]=atoi(moji)
...セミコロンないじゃん、とか思うわけですがまさかそんなコンパイルエラーの話じゃ
ないですよね?
fscanf(fp, %s, moji); で一文字づつ読めるのですか?どうやって確認なさいましたか?
(ここ以外には一文字読もうとしていると判断できそうな場所が見つからなかった)
strcpy(name, ");
strcpy(name, moji);
で何が起きているかお分かりですか?
その下の for ループの間中 moji は何も変化しないので、 atoi(moji) も同じ値のまま
ですから、map1.map[j + i *15] =atoi(moji); は何が起きているかお分かりですね?
それから map1 は何ですか?
読もうとしてるファイルの中も、どういうふうにデータが入っているのか知りたいですね。
> またatoiで変換した文字は、
>
> 文字 ”0”
> だったら、
> 数字 ”0”
>
> になるのでしょうか?
>
ということであれば、
int a = 100; // あえて100で初期化
a = atoi(0); // このあとaは?
を実行してみれば、一目瞭然。
この程度ならすぐに試せますよね?
1文字は%Cだろ
%Sは文字 列 でしょう
atoiの引数は最後がNULLで終わる文字 列 じゃなかったけ
他にも、以下のような問題が挙げられるかと。
fp=fopen(name,r);
で、ファイル読み込みができなかった場合の処理がない。
ファイルをオープンするnameを読み込みデータのバッファとして
使ってよいのか、という問題。
それ以前に、ファイルオープンは成功しているのか不明。
map1.map[j+(i*15)]=atoi(moji)
だけど、iもjも初期値は1だから、
[j+(i*15)]の初期値は[16]となるが、良いのか?
[j+(i*15)]だと、
i==1,j==20 のとき、[35]
i==2,j== 5 のとき、[35]
データが上書きされるけど、良いのか?
もし読み込んだ文字数が20バイト未満だったとき、for (j=1;...
のループはどうなるんだろう?
for (i=1;... のループで、データが読み込まれなかった時、
どうなるんだろう?
>[j+(i*15)]だと、
>i==1,j==20 のとき、[35]
>i==2,j== 5 のとき、[35]
>データが上書きされるけど、良いのか?
はい、今きずきました。ありがとうございます。
FILE *fp; //ファイルポインタ
int i,j,k;
i=1;
j=1;
fp=fopen(name,r);
k = fgetc(fp);
while(k != 58)
{
if(i==21)
{
i=1;
j++;
}
if(k==10)
{}
else
{
i=i+1;
map1.map[(i-1)+((j-1)*20)]=(k-48);
}
k = fgetc(fp);
}
fclose(fp);
でできました。ありがとうございます。
o_2さんのコードからすると、変数i,jと2つ用意する必要性は
まったく感じられないのですが。以下は、エラー処理を含む、
実装例です。
#include <stdio.h>
#include <ctype.h> // isdigit
int func(const char *name)
{
FILE *fp;
if ((fp = fopen(name, r)) == NULL)
return 1; // error: file can't open
int i = 0, c = fgetc(fp);
while (c != EOF) {
if (isdigit(c)) {
map1.map[i] = c - '0';
i++;
}
c = fgetc(fp);
}
fclose(fp);
return 0; // succeeded
}