ファイルから1文字ずつ文字を取得 – プログラミング – Home

ファイルから1文字ずつ文字を取得
 
通知
すべてクリア

[解決済] ファイルから1文字ずつ文字を取得


o_2
 o_2
(@o_2)
ゲスト
結合: 22年前
投稿: 31
Topic starter  

今、ファイルから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”

になるのでしょうか?


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

>うまくいきません。
どううまくいかないのですか? このソース、パッと見、

>map1.map[j+(i*15)]=atoi(moji)
...セミコロンないじゃん、とか思うわけですがまさかそんなコンパイルエラーの話じゃ
ないですよね?


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

fscanf(fp, %s, moji); で一文字づつ読めるのですか?どうやって確認なさいましたか?
(ここ以外には一文字読もうとしていると判断できそうな場所が見つからなかった)

strcpy(name, ");
strcpy(name, moji);
で何が起きているかお分かりですか?
その下の for ループの間中 moji は何も変化しないので、 atoi(moji) も同じ値のまま
ですから、map1.map[j + i *15] =atoi(moji); は何が起きているかお分かりですね?

それから map1 は何ですか?


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 23年前
投稿: 448
 

読もうとしてるファイルの中も、どういうふうにデータが入っているのか知りたいですね。

> またatoiで変換した文字は、
>
> 文字 ”0”
> だったら、
> 数字 ”0”
>
> になるのでしょうか?
>
ということであれば、

int a = 100; // あえて100で初期化
a = atoi(0); // このあとaは?

を実行してみれば、一目瞭然。
この程度ならすぐに試せますよね?


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

1文字は%Cだろ
%Sは文字 列 でしょう
atoiの引数は最後がNULLで終わる文字 列 じゃなかったけ


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

他にも、以下のような問題が挙げられるかと。

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;... のループで、データが読み込まれなかった時、
どうなるんだろう?


返信引用
o_2
 o_2
(@o_2)
ゲスト
結合: 22年前
投稿: 31
Topic starter  

>[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);

でできました。ありがとうございます。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

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
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました