- 締切済み
ファイルからの読み込みについて
スペースで区切られた数字列を3つずつ取り、3つ目の数字列の最後の数字が奇数ならば1を、偶数ならば2を配列に格納するプログラムを作っているのですが、 具体例 203 255 254 203 255 255 203 255 254 203 255 254 203 255 254 203 255 255 203 255 255 203 255 255 203 255 254 203 255 255 とあれば、2,1,2,2,2,1,1,1,2,1と順に格納する プログラムの実行がうまくいかず悩んでいます。 関係する部分を書き出すと b = 0; n = 0; m = 0; while(1){ data = fgetc(fi); if(data == EOF) break; a[n] = data; if(' ' == a[n]){ b++; } if(b == 3){ b = 0; t = a[n-1]; n = 0; if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[m] = 1; } else{ c[m] = 2; } m++; } else n++; } となっているのですが、上に書いた数字列をfiに読み込んで実行し、配列cを出力してみたところ 2122222222となっていました。 改行前は正確に出力されているので、改行する部分でなにか不都合が起こっているのかなと思い、いろいろ考えたのですが解決しません。 どなたかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chokiki
- ベストアンサー率36% (9/25)
当方の環境で試してみました。 アルゴリズムは一切手を加えていません。 宣言等必要部分だけ付け加えました。 void test1(){ FILE *fi; fi = fopen("C:\\a.txt","r"); int b = 0; int n = 0; int m = 0; int c[32]; char t; char a[32]; int data; while(1){ data = fgetc(fi); if(data == EOF)break; a[n] = data; if(' ' == a[n]){ b++; } if(b == 3){ b = 0; t = a[n-1]; n = 0; if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[m] = 1; }else{ c[m] = 2; } m++; }else{ n++; } } } 例の数字列のみ書かれたテキストを読み込みましたが、 問題なく2,1,2,2,2,1,1,1,2,1と出力されましたよ。 コンパイラはVC++2008です。 入力ファイルで違うものを指してる、出力の仕方が間違えているなどは考えられませんか? 途中経過を出力すると原因が特定出来るかもしれません。
- asuncion
- ベストアンサー率33% (2127/6289)
ちょっとした例です。ご自由に改変してください。 #include <stdio.h> #define SIZE (100) int main(void) { int arr[SIZE]; int num, ind, i; for (ind = i = 0; !feof(stdin) && ind < SIZE;) { scanf("%d", &num); if (++i % 3 == 0) { arr[ind++] = (num % 2) ? 1 : 2; } } for (i = 0; i < ind; i++) { printf("%d ", arr[i]); } return 0; }
- asuncion
- ベストアンサー率33% (2127/6289)
ソースコード全体もそれほど長くはならないと思いますので、 全部見せていただけますか? それから、各変数の役割を教えていただけますか? コメントがないので、「見た人が読み解きなさい」ということでしょうか?
補足
#include<stdio.h> int main(void) { FILE *fi; char fname[100], ss[255], d,a[100], t, ch; int data,count, b, n,m, co, err, c[1000]; printf("file name?\n"); gets(fname); fi = fopen(fname,"r"); if(fi == NULL){ exit(1); } fgets(ss,255,fi); if(ss[0]!='P') err = 1; if(ss[1]!='3') err = 1; if(err ==1){ printf("file type is wrong\n"); exit(1); } count = 0; while(count < 2){ d = fgetc(fi); if(d =='\n' ){ count++; } if(d == '#'){ count--; } } b = 0; n = 0; m = 0; while(1){ data = fgetc(fi); if(data == EOF) break; a[n] = data; if(' ' == a[n]){ b++; } if(b == 3){ b = 0; t = a[n-1]; n = 0; if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[m] = 1; } else{ c[m] = 2; } m++; } else n++; } m = 0; while(c[m] ==1 || c[m] == 2){ count = 0; while(count < 8){ if(c[m] == 1){ ch++; } ch = ch + ch; count++; m++; } printf("%c",ch); } fclose(fi); } です。 冒頭の部分は、読み込んだファイルがppm形式であるか判定し、ヘッダ部分を読み飛ばすためのものです。 最後のwhile文は別の作業ですので気にしないでください。 fi:数字列の書かれたファイルを読み込みます dataはEOFかどうかを判定するための変数です。 EOFでない場合aにそれを格納します。 スペースをいくつ読み込んだかをbに記録し、bが3になったとき tにスペースよりひとつ前の文字a[n-1]を格納します。 tが奇数字である場合に1を、それ以外の場合2をcに格納します。