• 締切済み

構造体とファイル検索(><)

なかなか前に進めず、困っています。(泣)現在、構造体とファイル検索を考えてるのですが、皆様にアドバイスを頂けたらと思っています。お願い致します。 テキストファイルの内容は自分で適当に作りました。このようにしています。 →ファイル名(soccer.txt)ファイルの中身→ 例「 番号,名前,年齢 」 1 ,川口 能活,33 38,楢崎 正剛,40 20,川島 永嗣,22 10,中澤 佑二,35 51,駒野 友一,19 9 ,中村 俊輔,29 22,遠藤 保仁,17 15,鈴木 啓太,32 19,本田 圭佑,51 28,家長 昭博,25 30,高原 直泰,18 7 ,播戸 竜二,44 ☆ /*記述*/ としているところへどのようにプログラムを書けばよいのかわかりません。(泣)どなたか教えて頂けないでしょうか。お願い致します。 サンプル: // 最大のデータ数 #define MAX_LIST (100) // 関数のプロトタイプ宣言 void read_data( FILE *fp, struct data list[], size_t size ); void print_data( struct data list[], size_t size ); void search_num( struct data list[], size_t size ); void search_name( struct data list[], size_t size ); void search_age( struct data list[], size_t size ); // メイン関数 int main( void ) {  struct data list[ MAX_LIST ];   FILE *fp;  int menu;    if ( (fp = fopen("soccer.txt","r")) != NULL ){   read_data( fp, list, MAX_LIST );    fclose( fp );      do {    printf( "条件を選択して下さい[1~4]\n" );    printf( " 1:全部表示\n" );    printf( " 2:番号で検索\n" );    printf( " 3:名前で検索\n" );    printf( " 4:年齢で検索\n" );    printf( "99:終了\n" );    scanf( "%d", &menu );        switch ( menu ){     case 1: print_data( list, MAX_LIST ); break;     case 2: search_num( list, MAX_LIST ); break;     case 3: search_name( list, MAX_LIST );break;     case 4: search_age( list, MAX_LIST ); break;     default: break;    }   } while ( menu != 99 );     return 0;  }  printf( "soccer.txt - ファイルが見つかりません。\n" );  return 1; } // テキストデータを読み込む専用関数 void read_data( FILE *fp, struct data list[], size_t size ) {  /* 記述 */ } // 構造体の内容を表示する専用関数 void print_data( struct data list[], size_t size ) {  /* 記述 */ } // 番号で検索 void search_num( struct data list[], size_t size ) {  /* 記述 */ } // 名前で検索 void search_name( struct data list[], size_t size ) {  /* 記述 */ } // 年齢で検索 void search_age( struct data list[], size_t size ) {  /* 記述 */ }

みんなの回答

  • splwtr
  • ベストアンサー率16% (75/461)
回答No.6

登録件数にもよりますが、 grep で検索した結果をチェックした方が楽そうですね。 そのサンプル・コードだと、機能によってファイルの読み方も違うの? 読んだ内容を識別し、どうチェックするかを、関数ポインタで機能を切り替えて実行すれば、それで済むことじゃないの? 私の場合は、Excelでオート・フィルタ? で対処します。 今使えるものを使った方が楽だから。 csvファイルの先頭に int, string,int とか、型定義な要素があると 使えるかもしれないね。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

どこかで見たコードだと思いましたが、 回答者さんの参考コードそのままですね。。。 >個人情報の掲載や誰かの書いたものをそのまま転記するなどの・・・ #とりあえず禁則事項に触れてる気がしますが。 アドバイスっていうのはあくまでも『助言』であって、 解答をそのまま教えることではありません。 あなたが何を理解していて、何が理解できないのか、 という情報が無ければ、アドバイスのしようも無いと思います。 また、検索の仕様が曖昧です。 例えば、番号は重複することは無い(そういう仕様なら)でしょうが、 年齢や名前というのは、重複する可能性があります。(今回はたまたま無い)そういったものはどうするのでしょうか? ・最初に見つかったものだけ見つかったことにする。 ・全部見つかったことにして個数を数える。 ・そもそも重複を許可しない。 など できれば、あなたがここまでやって、 分からなかったという部分まで説明してください。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス >書けないから投稿しました。すみませんでした。  ↑  本当かな。前回の質問で search_all() 関数はファイルから行単位で読み込んで処理を  行っていますよ。これを元に読み込み専用の read_data() 関数が作れますけど。 ・あと前回のサンプルの補足ですが、search_num()、search_name()、search_age() 関数の  内部で scanf() 関数を使ってキーボードから検索番号、検索名、検索年齢を入力する部分を  記述して下さい。main() 関数ではメニューの振り分けだけに scanf() でキーボード入力を  行っています。 ・検索番号の search_num() だけ下のサンプルに載せておきますので残りの検索名、検索年齢、  データ読み込み、データ表示は頑張って作成してみて下さい。 サンプル: // 番号で検索 void search_num( struct data list[], size_t size ) {  size_t i;  int num;    // 入力部  printf( "\n検索する番号を入力して下さい:" );  scanf( "%d", &num );  printf( "\n\n" );    // 検索  for ( i = 0 ; i < size ; i++ ){   if ( list[i].no == num ){    /*    番号検索で見つかったときの表示    */    return;   }  }  /*  見つからなかったときのエラー表示  */ } その他: ・上記のサンプルを見れば分かると思いますが、そんなに難しくはありません。  名前の検索、年齢の検索は上記のを参考にすれば直ぐにできると思います。  頑張って作成してみて下さい。 ・あと print_data() 関数は上記のサンプルで入力部をなくして構造体のデータを  順番に printf() していけば出来ます。前回の質問であった search_all() に >printf("%s %s %s \n", lis->no, lis->name, lis->age);  ↑  この1行がありますよね。  上記のサンプルの『検索』の for ループに printf() の1行を記述すれば  print_data() 関数は出来ますよ。 ・以上。

  • maku_x
  • ベストアンサー率44% (164/371)
回答No.3

とりあえず一部コードを書いてみます。C言語を書くのは久しぶりなので、間違っていても責めないでください(笑)。 #define MAXBUF 256 #define DELIMITER "," // テキストデータを読み込む専用関数 int read_data( FILE *fp, struct data list[], size_t size ) { char buf[MAXBUF], *s_st, *s_nxt; int cnt=0; while (fgets(buf, MAXBUF, fp) != NULL) { s_st = buf; s_nxt = strtok(buf, DELIMITER); if (s_nxt != NULL) { /* 選手の番号 */ *s_nxt = '\0'; list[cnt].no = atoi(s_st); s_st = s_nxt + 1; } s_nxt = strtok(NULL, DELIMITER); if (s_nxt != NULL) { /* 選手の名前 */ *s_nxt = '\0'; strcpy(list[cnt].name, s_st); s_st = s_nxt + 1; } s_nxt = strtok(NULL, DELIMITER); /* 選手の年齢 */ if (s_nxt != NULL) { *s_nxt = '\0'; } list[cnt].age = atoi(s_st); if (++cnt >= size) { break; } } list[cnt].no = (-1); /* データの終わり */ return cnt; } // 全ての構造体の内容を表示する専用関数 int print_all_data( struct data list[], size_t size ) { int cnt; for (cnt=0; (cnt<size) && (list[cnt].no >= 0); cnt++) { /* 1つの構造体の内容を表示 */ print_data(&list[cnt]); } return cnt; } // 番号で検索 int search_num( struct data list[], int search_num, size_t size ) { int cnt, scnt=0, snum_min, snum_max; switch (search_num) { /* 検索条件の振り分け */ case 1: snum_min = 1; snum_max = 9; break; case 2: snum_min = 10; snum_max = 19; break; case 3: snum_min = 20; snum_max = 29; break; case 4: snum_min = 30; snum_max = 0x7fffffff; break; default: snum_min = (-1); snum_max = (-1); break; } for (cnt=0; (cnt<size) && (list[cnt].no >= 0); cnt++) { if ((list[cnt].no >= snum_min) && (list[cnt].no <= snum_max) ) { /* 条件に合う構造体の内容を表示 */ print_data(&list[cnt]); scnt++; } } return scnt; } こんなところでしょうか。 print_data() は1つの構造体を出力するだけですから、書けますよね。 search_name() や search_age() は、上記 search_num() を基に、適宜書き換えれば良いはずです。 また、main() の中の search_~() を呼ぶ前に、条件を入力する処理を追加してください。 分からない関数があったら、linuxの man ~ とか、参考URLで調べてください。

参考URL:
http://www.linux.or.jp/JM/
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

http://okwave.jp/qa3114524.html の続き。というかまるで進んでませんな。 ちょっとは自分で書こうよ。

altair56
質問者

補足

書けないから投稿しました。すみませんでした。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

で、その構造体の定義は?

関連するQ&A

  • 構造体のファイル書き込み&読み出しに関して2

    C言語を勉強しているものです。指定した番号に構造体を書き込み、指定した番号をの構造体を出力するプログラムを作成したいのですが、表示結果画像のようになってしまいます。 デバックしても、どこが違うのかがわかりません。説明不足かとは思いますがご教授お願いします。 ↓↓ソースコード↓↓ #include<stdio.h> #include<stdlib.h> struct S_data{ char Name[10+1];/*名前*/ int Sex;/*性別*/ int Height;/*身長*/ float Weight;/*体重*/ }; void FR_data(FILE *Fp,int pos); void FW_data(FILE *Fp,int pos); void OUP_data(struct S_data tag); void INP_data(struct S_data *tag); int RF_data(FILE *Fp,struct S_data *tag,int pos); int WF_data(FILE *Fp,struct S_data *tag,int pos); void main(){ FILE *Fp; int pos=0; int Ret; Fp=fopen("aaa.dat","r+b"); if(Fp==NULL){ Fp=fopen("aaa.dat","w+b"); if(Fp==NULL){ printf("File not open\n"); exit(2); } } while(1){ printf("入力の番号[0:終了]->"); scanf("%d",&pos); if(pos==0) break; FW_data(Fp,pos); } while(1){ printf("出力の番号[0:終了]->"); scanf("%d",&pos); if(pos==0) break; FR_data(Fp,pos); } Ret=fclose(Fp); } void FR_data(FILE *Fp,int pos){ struct S_data Temp; /*出力情報*/ int Ret; /*返却値*/ memset(&Temp,'\0',sizeof(Temp)); Ret=RF_data(Fp,&Temp,pos); /*情報の読み込み*/ if (Ret!=1){ printf("File not read\n"); }else{ OUP_data(Temp); /*情報の表示*/ } } void FW_data(FILE *Fp,int pos){ struct S_data wk; /*入力情報*/ int Ret; /*返却値*/ memset(&wk,'\0',sizeof(wk)); INP_data(&wk); /*情報の入力*/ Ret=WF_data(Fp,&wk,pos); /*情報の書き込み*/ if (Ret!=1){ printf("File not write\n"); } } void OUP_data(struct S_data tag){ printf("Name:%s\n",tag.Name); if (tag.Sex==0){ printf("Sex:M\n"); }else{ printf("Sex:F\n"); } printf("Height:%d\n",tag.Height); printf("Weight:%.2f\n",tag.Weight); } void INP_data(struct S_data *tag){ memset(tag,'\0',sizeof(tag)); printf("Name-->"); scanf("%s",&tag->Name); printf("Sex[0:M1:F]-->"); scanf("%d",&tag->Sex); printf("Height-->"); scanf("%d",&tag->Height); printf("Weight-->"); scanf("%f",&tag->Weight); } int RF_data(FILE *Fp,struct S_data *tag,int pos){ int Ret_I; /*fseek返却値*/ size_t Ret_S; /*fread返却値*/ Ret_I=fseek(Fp,sizeof(tag)*(pos),SEEK_SET); Ret_S=fread(tag,sizeof(tag),1,Fp); return Ret_S; } int WF_data(FILE *Fp,struct S_data *tag,int pos){ int Ret_I; /*fseek返却値*/ size_t Ret_S; /*fwrite返却値*/ Ret_I=fseek(Fp,sizeof(tag)*(pos),SEEK_SET); Ret_S=fwrite(tag,sizeof(tag),1,Fp); return Ret_S; }

  • ファイル操作やポインタ、構造体について(C言語)

    C言語の課題で詰まってしまいました。宜しければ助言を宜しくお願いします。 コマンド選択で,0) 終了,1) 追加,2) 検索(id),3)変更 が行える学生成績管理プログラムを作成する。 データは,学生の番号 名前 GP 総単位数 形で学生のデータを持っているファイルである。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct student{ int id; char name[25]; int gp; int credit; }; void add(char *, struct student);//追加 int search(char *, struct student *);//検索 void change(char *, struct student);//指定したidの学生の情報を変更 main(int argc,char *argv[]) { FILE *fp; int i = 0; int num; struct student students; if(argc == 1){ printf("set filename\n"); return 1; } while(1) { printf("1)add 2)search 0)quit "); scanf("%d",&num); if(num == 0) break; /* 追加 */ if(num == 1) { printf("id name gp credit ? "); scanf("%d %s %d %d", &students.id, students.name, &students.gp, &students.credit); add(argv[1], students); } /* 検索 */ if(num == 2) { printf("id ? "); scanf("%d", &students.id); if(search(argv[1],&students)){ printf("%d %s %d %d\n", students.id, students.name, students.gp, students.credit); } else{ printf("ID %d Not Found.\n",students.id); } } if(num == 3){ //変更 } } } /* 追加ルーチン */ void add(char *filename, struct student students) { FILE *fp; if((fp = fopen(filename, "a")) == NULL){ printf("can't open %s\n", filename); exit(1); } fprintf(fp,"%d %s %d %d\n", students.id, students.name, students.gp, students.credit); fclose(fp); } /* 検索ルーチン */ int search(char *filename, struct student *students) { FILE *fp; int id; char name[25]; int gp; int credit; if((fp = fopen(filename, "r")) == NULL){ printf("can't open %s\n", filename); exit(1); } while(fscanf(fp,"%d %s %d %d", &id, name, &gp, &credit) != EOF) { if(id == students->id){ students->id = id; strcpy(students->name ,name); students->gp = gp; students->credit = credit; return 1; } } return 0; fclose(fp); } /* 変更ルーチン */ void add(char *filename, struct student students){ } ------------ここまで------------ ファイルの操作での入出力は"a"や"r"、また"w"を利用するのかとも思いましたが、 指定したIDの内容を書き換えるにはポインタを2つ使う方法しか思いつかないのですが、与えられた問題で、変更のプロトタイプは void change(char *, struct student); となっていて、どうやるのかまったく見当もつきません。 稚拙な文で伝わりにくいかもしれませんが、 変更のやり方についてご教授願います。 見難くて申し訳ありません。 どうか宜しくお願いします。

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • テキストデータから構造体にデータを保存する方法

    C言語初心者です。 大きなテキストデータ(730MB)からデータを取得して、構造体に保存し表示するというプログラムを作成しています。テキストのサイズが大きいため構造体のサイズを400000とし、 残りをftellとfseekを使用してファイルポインタをずらして全データを順次読み込んで表示しようとしているのですが、実行すると400000行目以降(最初の構造体のMAX時点)がうまく読み込めません。 詳しい方がいましたら、ご教授願います。 #define MAX_SIZE 400000 char filename[] = ″test.txt"; struct ALL_DATA{ char cmd[10]; int addr; int bsize; }; for (int lp = 0; lp < 100; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if (lp > 0){ fseek(fp, LP, SEEK_SET); } if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", ADATA[fc].cmd, &ADATA[fc].addr, &ADATA[fc].bsize); } } LP = ftell(fp); //現在のFPの取得 printf("********** FP-> %ld *********\n", LP); fclose(fp); while (i < MAX_SIZE){ if (loopcnt == 0){ printf("ADATA[i].cmd -> %s, ADATA[i].addr -> %d, ADATA[i].bsize -> %s\n",ADATA[i].cmd, ADATA[i].addr, ADATA[i].bsize); // i++; } } 上記のような形で作成しています(一部抜粋)。 読み込むテキストデータは testA 123456 20 testA 23415 2 testB 12114567 678 のように「文字列 スペース 数字 スペース 数字」と並んでおり 値はランダムになっています。 初めて質問するため、わかりにくい記述があるかと思いますが、よろしくお願いします。

  • csvファイルを構造体に読み込みたい

    C言語初心者です。 csvファイルのデータを1行ずつ構造体に読み込みたいのですが、うまくできません。 #define MAX_SIZE 100 char filename[] = ″test.csv"; struct ALL_DATA{ int cnt; char list[10]; char addr[10]; char cmd[10]; char csize[10]; char input[10]; char icmd[10]; char input2[10]; }; for (int lp = 0; lp < 10; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],\n", &ADATA[fc].cnt, ADATA[fc].list, ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); } } fclose(fp); while (i < MAX_SIZE){ printf("ADATA[i].cnt -> %d, ADATA[i].list -> %s, ADATA[i].addr -> %s, ADATA[i].cmd -> %s, ADATA[i].csize -> %s, ADATA[i].input -> %s, ADATA[i].icmd -> %s, ADATA[i].input2 -> %s\n",ADATA[fc].cnt, ADATA[fc].list,ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); i++; } } 読み込みたいcsvデータは 1 test 0x0012 write 0x001 yes 0xabc yes 2 testa 0x00cd read 0x024 0x1a3 のように、「数字、文字列・・・」と並んでいます。 このデータを取り込んで表示させたところ、 最初の数字は問題ないのですが、ADATA[i].addr から値がおかしくなり、 ADATA[i].addr = 0x0012write ADATA[i].cmd = write ADATA[fc].csize = 0x001yes のように、16進数を文字列として構造体に入れるときに、次の文字(英字)まで一緒に含んでしまう現象が出ております。 ネットで調べて、csvファイルから構造体に取り込む方法はいくつか見たのですが、同じようにしている(と思っている)のにうまくいかないため、質問させていただきました。 原因がわかる方がいらっしゃいましたら、アドバイスをよろしくお願いいたします。

  • 検索の方法を教えて頂きたいです。

    現在、テキストファイルの検索プログラムを課題で行っているのですが、どう処理すればよいか、苦悩しています。先生には、構造体を利用するよう言われています。どなたか、アドバイスを頂けないでしょうか?テキストファイルの内容は自分で適当に作りました。このようにしています。 →ファイル名(soccer.txt)ファイルの中身→ 例「 番号,名前,年齢 」 1 ,川口 能活,33 38,楢崎 正剛,40 20,川島 永嗣,22 10,中澤 佑二,35 51,駒野 友一,19 9 ,中村 俊輔,29 22,遠藤 保仁,17 15,鈴木 啓太,32 19,本田 圭佑,51 28,家長 昭博,25 30,高原 直泰,18 7 ,播戸 竜二,44 問題の流れは、 (1)条件を選択して下さい[1~4]   1:全部表示   2:番号で検索   3:名前で検索   4:年齢で検索   99:終了 (2) 1番を選んだら、その名の通りファイルの中身を全部表示する。 (3) 2番を選んだら、さらに、番号の条件を選んで入力[1~4]    1: 1~9 , 2: 10~19 , 3: 20~29 , 4: 30以上 とし、条件にヒットするとその行を表示するよう、考えています。 一応、全部表示は、ソースはめちゃくちゃかもしれませんが、全部表示できたので、全部の検索方法をと言うと、図々しいと思うので、番号で検索だけでも、なにかアドバイス頂けたらと思っています。 どうぞ、宜しくお願いします。(泣) #include<stdio.h> #include <stdlib.h> #include <string.h> struct data{ int no; // 番号 char name[20]; // 氏名 int age; // 年齢 }; int search_all(struct data *lis); void search_no(int number); int main() { int a; int number; data list1[12]; while(a){ printf("条件を選択して下さい[1~4]\n"); printf(" 1:全部表示\n"); printf(" 2:番号で検索\n"); printf(" 3:名前で検索\n"); printf(" 4:年齢で検索\n"); printf(" 99:終了\n"); scanf("%d", &a); if(a == 1){ // 全部表示 printf("全部表示\n"); search_all(list1); } //番号で検索 else if(a == 2){ printf("番号の条件を選んで入力して下さい[1~4]\n"); printf(" 1: 1~9\n 2: 10~19\n 3: 20~29\n 4: 30以上\n"); scanf("%d", &number); search_no(number); } } return 0; } //ファイルの情報を取得する int search_all(struct data *lis) { FILE *fp; char s[20]; char str1[20]; //番号を格納 char str2[20]; //名前を格納 char str3[20]; //年齢を格納 fp = fopen("soccer.txt", "r"); //1行単位で読込み while(fp != NULL){ fgets(s, 20, fp); if (feof(fp)){ break; } //番号を取得する strncpy(str1, s, 2); //NULL文字追加 str1[2] = '\0'; lis->no = (int)str1; //名前を取得する strncpy(str2, &s[3], 9); //NULL文字追加 str2[9] = '\0'; strcpy(lis->name, str2); //年齢を取得する strncpy(str3, &s[13], 2); //NULL文字追加 str3[2] = '\0'; lis->age = (int)str3; printf("%s %s %s \n", lis->no, lis->name, lis->age); } fclose(fp); return 0; } //番号検索 void search_no(int number) { printf("該当の番号%dの行を表示\n", number); }

  • ファイルから読み込んだデータを構造体に格納できますか?

    1レコード19バイトのファイルを 読み込む処理を行っています。 地区名10バイト 県名8バイト 改行1バイト このデータをdouken(構造体)に格納したいのですが >while (fgets(dou,19,fp) != NULL){ で、エラーになってしまいます。 どのようにしたら ファイルから読み込んだデータを 構造体に格納できますか? #include<stdio.h> #include <stdlib.h> struct douken { char tiku[10]; char ken[8]; } main(void){ FILE *fp; struct douken dou[100]; int i; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } while (fgets(dou,19,fp) != NULL){ ・ ・ ・

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • 構造体とfscanf

    ファイルをfscanfを使って文字列を構造体に格納して読み込みたいのですが読み込み方の記述方法がわか りません。 どのようにしたら読み込めますか? 以下ソース ---ソース--- #include <stdio.h> #include <string.h> #include <stdlib.h> struct info //1回目の呼び出し方法 { char name[20]; char mb[20]; }deta; struct info2 //2回目の呼び出し方法 { char *name; char *mb; }deta2; struct info3 //3回目の呼び出し方法 { char *name[6]; char *mb[6]; }deta3; void main(void){ FILE *fp; fp=fopen("yasa.txt","r+"); while( !feof( fp ) ){ fscanf( fp, "%s %s",deta.name,deta.mb ); printf("%s %s\n",deta.name,deta.mb); } rewind( fp ); //2回目の呼び出し方法での記述の仕方がわからない rewind( fp ); //3回目の呼び出し方法での記述の仕方がわからない fclose(fp); } ---yasa.txtの内容--- オレンジ ● みかん ● いちご × もも ● ぶどう × キウイ ●

  • ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込

    ネットで落ちていた「Excelで作ったデータ(CSVファイル)の読み込みプログラム」をそのままコンパイルして実行しようと思ったのですが、 sample.c: In function 'main': sample2.c:9: warning: return type of 'main' is not 'int' と、表示されてしまいます。 プログラミング初心者なので、どこが間違っているのかわかりません。 回答またはアドバイスの程、よろしくお願いいたします。 ネットで落ちていたプログラムを以下に記載します。 sample2.c #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("コマンドの入力形式が間違っています.\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("ファイルがオープンできません[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("データが不正です[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("エラー(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("エラー(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("エラー(3)\n"); break; } if(*wp != '\0'){ printf("エラー(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); }

専門家に質問してみよう