• ベストアンサー

fscanfについて

教えてgooを参考にしましたが、fscanfを使ってテキストファイルの任意の行のデータを読み込みたいのですがうまくいきません。 テキストファイルは 0 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 1 1 といった感じの2進数で3行以上あります。 下に自分が作ったソースがあります。 どこがいけないのか、どういった手法があるのかを詳しく教えていただけたら幸いです。よろしくお願いします。 int gene[10]; FILE* f=fopen("Gene.txt","r"); while(fscanf(f,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &gene[0],&gene[1],&gene[2],&gene3],&gene     [4],&gene[5],&gene[6],&gene[7],&gene       [8],&gene[9])!=EOF) n++; fclose(f);

質問者が選んだベストアンサー

  • ベストアンサー
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.3

文字列の解析は昔から、トークン(strtok())を使うのがスマートですよ。 windowsの環境でも有ります。 http://www.microsoft.com/japan/developer/library/vccore/_crt_strtok.2c_.wcstok.2c_._mbstok.htm

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

良いやり方ではないと思うが、「どういった手法」ということで参考までに。  int gene[10];  char szLine[25];  char *pBuff;  int i,n = 0;  FILE* fp=fopen("Gene.txt","r");  while(fgets(szLine,24,fp) != NULL) {   pBuff = szLine;   for(i = 0; i < 7; i++) {    gene[i] = strtok(pBuff," \n")[0];    pBuff = NULL;   }   n++;  }  fclose(fp);

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

ファイルの方は1行に空白文字区切りで7つの数が入っているんですよね? ならばフォーマットの%dの数もそれに合わせないとずれて行きます。それとカンマではなく空白で区切る必要があります(ファイルの方が空白文字で区切られているからです)。 ということで fscanf() の部分はこうです。 fscanf(f, "%d %d %d %d %d %d %d",     &gene[0], &gene[1], &gene[2], &gene[3],     &gene[4], &gene[5], &gene[6])

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • ポインタ配列をfscanfで読み込むと・・・

    現在BorlandのC言語で人の名前をセーブする処理を 作っています。そこで以下の様に書いたのですが、 コンパイラでは通るのに、実行してセーブをして ロードをすると必ず強制終了させられてしまいます。 これは一体何がいけなかったのでしょうか? また、どのように書いたらキチンと動作するのでしょう? #include <stdio.h> char *name[10]; void save(void){ FILE *file; file = fopen("name.txt", "w+"); fprintf(file,"%s %s %s ", name[1], name[2], name[3]); fclose(file); } void load(void){ FILE *file; file = fopen("name.txt", "r+"); fscanf(file,"%s %s %s ", &name[1], &name[2], &name[3]); fclose(file); } int main( void ){ name[1] = "いち"; name[2] = "に"; name[3] = "さん"; while ( 1 ){ int i; printf("name[1]:%s name[2]:%s name[3]:%s \n", name[1], name[2], name[3]); puts("1:セーブ 2:ロード"); scanf("%d",&i); if ( i == 1 ) save(); else load(); } return 0; }

  • fscanf()【C言語】

    テキストファイルをうまく読み込んでくれません。 どうかご教示お願いいたします。 環境 Windows7 Borland C++ 5.5.1 for Win32 status.txtの内容 1.50,40.0 1.55,45.0 1.60,50.0 1.65,55.0 1.70,60.0 1.75,65.0 1.80,70.0 1.85,75.0 1.90,80.0 プログラムの内容 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ FILE *filepointer; double s[10],w[10]; int i=0,ret; if((filepointer=fopen("status.txt","rt"))==NULL){ printf("file open error!!\n"); exit(1); } printf("%X\n",filepointer); while((ret=fscanf(filepointer,"%f,%f",&s[i],&w[i]))==2){ i++; printf("%d %f %f\n",ret,s[i],w[i]); } fclose(filepointer); return 0; } 出力結果 40E714 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 0.000000 0.000000 2 5.121811144940079976000000000000000000000e+303 0.000000 2 0.000000 0.000000 2 0.000000 0.000000

  • fscanf

    fscanfを使って、ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたいと思っているのですが、どうすれば良いのかわかりません。 int main(int argc,char *argv[]){ FILE *fp; char *word; fp = fopen(argv[1], "r"); if(fp == NULL){ printf("error: not open file.\n"); return(0) ;} while( ){ fscanf(fp,"%[a-zA-Z]",word); printf("%s\n", word); fflush(stdout); } fclose(fp); return 0; } とりあえず上の様なプログラムで、一単語ずつ順番に単語を出力できるようにしたいと思っているのですが。 いろいろ変なところなど在ると思いますが、whileの条件など、どうすればよいか教えてください。

  • fscanf関数について

    -------------------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE*fp; int ch,dt; char ss[80]; if((fp=fopen("bbb.txt","w"))==NULL){ printf("出力ファイルをオープンできません.\n"); exit(1); } fprintf(fp,"%c",'A'); fprintf(fp,"%s\n","abcdeABCDE"); fprintf(fp,"%d\n",1234); fclose(fp); if((fp=fopen("bbb.txt","r"))==NULL){ printf("入力ファイルをオープンできません.\n"); exit(1); } ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); fscanf(fp,"%d",&dt); printf("dt=%d\n",dt); fclose(fp); return 0; } -------------------------------------------------- 以上のプログラムで、プログラムの通り「bbb.txt」は、 AabcdeABCDE 1234 となっております。 そこで疑問なのですが、「ch=fgetc(fp);」は1文字読み込みなので、'A'だけと分かるのですが、「fscanf(fp,"%s",ss);」はfpからの読み込みで何故、 AabcdeABCDE 1234 の全部を読み込まず、'A'を抜かした、「abcdeABCDE」だけを読み込んでくれるのか? 後、「fscanf(fp,"%d",&dt);」は何故「AabcdeABCDE」を抜かした、「1234」だけを読み込んでくれるのかが分かりません。 「fscanf(fp,"%d",&dt);」については数値だけを読み込んでくれるのかと思い、 ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); の部分を無くせば、「1234」だけを読み込んでくれるのかと思ったのですが、数値は正しく表示されません。 以上教えていただければ嬉しいです。

  • fprint()とfscanf()を用いたプログラムについて

    テキストファイルへの出力はきちんとできているのですが、 得点・合計得点出力のところでつまづいてしまいます。 どうすればいいでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char name[20]; int ten[3]; }RECORD; void csv(char *); void display_csv_file(char *); FILE *fpcsv; void main(int argc, char **argv) { csv(argv[1]); /* キーボード ⇒ CSV(テキスト)ファイル */ display_csv_file(argv[1]); /* CSV(テキスト)ファイル ⇒ ディスプレィ */ } void csv(char *filename) { RECORD seiseki; int i; fpcsv = fopen(filename,"w+"); while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){ if(seiseki.name != NULL){ for(i = 0; i < 3;i++){ printf("得点%d >", i + 1); scanf("%d", &seiseki.ten[i]); } fprintf(fpcsv,"%s, %d, %d, %d, ", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]); } rewind(stdin); } fclose(fpcsv); } void display_csv_file(char *filename) { char buf[255]; int i, sum, tokkuten[3]; fpcsv = fopen(filename,"r+"); while(fscanf(fpcsv,"%s%d%d%d", buf, tokkuten[0],tokkuten[1],tokkuten[2]) != EOF){ /*名前表示*/ strtok(buf,","); printf("name:%s ",buf); /*得点表示&合計計算*/ printf("得点1:%d 得点2:%d 得点3:%d", tokkuten[0],tokkuten[1],tokkuten[2]); sum = tokkuten[0] + tokkuten[1] + tokkuten[2]; /*合計表示*/ printf(" 合計得点: %d\n", sum); } fclose(fpcsv); }

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

  • 2バイト読飛ばして、スペースに置き換えたいです

    Cで、改行がないテキストファイルを800バイト毎に改行を入れることは無事できたのですが、254バイト目と255バイト目に化けている文字があり、それを半角スペース2つに置換したいのですがどうすればよいでしょうか? #include <stdio.h> int main() { FILE *f1,*f2; int i=0; char c; f1 = fopen("afile.txt", "r"); f2 = fopen("bfile.txt", "w"); if (f1 && f2) { while(!feof(f1)) { fscanf(f1, "%c", &c); fprintf(f2, "%c", c); i ++; if (i == 800){ i=0; fprintf(f2, "\n"); } } fclose(f2); fclose(f1); } }

  • fscanfを使った入力方法.ミスはどこ?

    簡単な内容で申し訳ありませんが,お願いします. インプットファイルからデータを入力したいのですが, うまくいきません.以前は同様の書き方で入力できたので, どこがおかしいのか分かりません.慣れた方にはすぐに 見つけられるのでしょうが,どこかに違いがあるのか 探せず困っています.ミスを教えていただけませんか? -------------------- double dlt1; dlt2以下も同様にdoubleで定義. FILE *input; input=fopen("input.txt","r"); fscanf(input,"%f",&dlt1); fscanf(input,"%f",&dlt2); fscanf(input,"%f",&dlt3); fscanf(input,"%f",&dlt4);  以下,同じように20個ほどの  入力値が続きます. fclose(input);  以下,計算が続きます. -------------------- input.txtの中身は以下のようになっています. ------ 1. 0.136 10. 2.8e-10 以下同様の数字が続く. ------

  • C言語の初歩的な質問です。

    C言語の初歩的な質問です。 fopenでtextファイルを複数開きたいんですけど どのようにすればよいかわかりません。 感覚的には for(i=1;i<11;i++){ FILE*fpi; fpi=fopen("i.txt","r"); while((fscanf(fpi,"%s",&score[i]))!=EOF) { }; のようにしたいんです。 もし無理ならばほかに何か方法はありませんか? わかりにくい質問ですいませんが どなたか教えてください。