• 締切済み
  • すぐに回答を!

c言語で文書検索プログラムについて質問です。

いつもお世話になっています。 今回、大学の課題でc言語を用いて文書検索のプログラムを作成しています。 クエリ(検索単語)を2つ入力して、クエリ2つを同じ行に含む1文が存在した場合そのテキストファイルのファイル名を出力するプログラムを作成しています。 検索する文書は、ソースファイルと同じディレクトリにあるcorpusディレクトリ内のテキストファイルについて行います。 概ね、自力で作成はできているよう思うのですが、どうしても出力がうまくいきません。 出力条件、もしくはstrcmpのあたりに原因があるような気がするのですが・・・。 以降に私の作成したソースファイルを添付しておきますので、 原因のわかる方ぜひお願いします。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int main(int argc, char* argv[]){ FILE* fp; char buffer[1024]; char kueri1[256]; char kueri2[256]; int flag_kueri = 0; //kueri1,kueri2がどちらもあれば1に int flag_kueri1 = 0; //kueri1があれば1に int flag_kueri2 = 0; //kueri2があれば1に int i; cahr* s; char* delimiter = " .,"; /*コマンドラインが正しく入力されているかの確認*/ if(argc < 4){ printf("error1\n"); exit(1); } /*入力されたクエリ1をkueri1に格納*/ strcpy(kueri1,argv[1]); /*入力されたクエリ2をkueri2に格納*/ strcpy(kueri2,argv[2]); /*kueri1の英小文字を英大文字に変換する処理を\0まで繰り返す*/ s = kueri1; while(*s != '\0'){ *s = toupper(*s); s++; } /*kueri2の英小文字を英大文字に変換する処理を\0まで繰り返す*/ s = kueri2; while(*s != '\0'){ *s = toupper(*s); s++; } /*メインループ*/ for(i = 3; i < argc; i++){ /*ファイルを開く*/ if((fp = fopen(argv[i], "r")) == NULL){ printf("error2"); exit(1); } /*文書を1行ずつ読み込んで処理を行う*/ while(fgets(buffer,sizeof(buffer),fp) != NULL){ /*最後に\0を格納*/ buffer[strlen(buffer) - 1] = '\0'; /*bufferの英小文字を英大文字に変換する処理を\0まで繰り返す*/ s = buffer; while(*s != '\0'){ *s = toupper(*s); s++; } /*strtokを用いて単語ごとに区切っていく(1単語目)*/ s = strtok(buffer,delimiter); if(s != NULL){ /*kueri1かどうか判定*/ if(strcmp(s,kueri1) == 0){ flag_kueri1 = 1; } /*kueri2かどうか判定*/ if(strcmp(s,kueri2) == 0){ flag_kueri2 = 1; } /*strtokを用いて単語ごとに区切っていく(1単語目)*/ while((s = strtok(NULL,delimiter)) != NULL){ /*kueri1かどうか判定*/ if(strcmp(s,kueri1) == 0){ flag_kueri1 = 1; } /*kueri2かどうか判定*/ if(strcmp(s,kueri2) == 0){ flag_kueri2 = 1; } } } /*kueriが両方なかったらflar_kueriを1にする*/ if(flag_kueri1 == 1 && flag_kueri2 == 1){ }else{ flag_kueri = 1; } /*両方のkueriがあればファイル名を出力*/ if(flag_kueri == 0){ s = argv[i]; printf("file_name: %s",s); } } fclose(fp); exit(0); }

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数217
  • ありがとう数0

みんなの回答

  • 回答No.4

#2 です 判定は 関数fとできて 0または1を返せばよい while文のなかで  if (f(x) && f(y)) { 処理を行う } でかけてしまう。 オブジェクト指向言語で言われるリファクタリングの匂いはここでも有効です。重複行を避ける。 No3の方がいわれるのは、マジックナンバーを使うに近いかな。 それともう一点、一時的な変数を使わない。 フラグの変数を使わなくても 毎回関数を呼ぶ出せば、変数は使わなくてすむ。 なぜ変数を避けるかは、今の場合 毎回0に初期化されてないから、一度1を代入したら変更されない限り、1のまま。なぜなら、一番最初に定義されているので、while 文では同じスコープのまま! つまり、一時的期変数はこういうミスが起きてしまうから、使うなっていうわけ。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • c言語を用いた文書検索に関する質問です。

    いつもお世話になっています。 c言語にあまり詳しくないので、どなたか詳しい方お願いします。 今回、ディレクトリの複数文書内で特定の単語(今回はクエリと呼びます)を含む文書を探し出すして、テキストファイル名を表示する処理を行うプログラムを作成していました。 以下に添付したソースは、コンパイル自体は通るのですがコマンドラインを ./ex12 "green" corpus/*.txt と入力するとsegmentation faultとなってしまいます。 (ex12は実行ファイル名、greenに特に意味はありません。別の単語でも同じ結果が出てしまいます。) 複数ファイルではなく1つの文書内での検索は問題なかったのですが、何が原因なのかがよく分かりません。 1つの文書内検索の際は、メインループの最初のfor文を除いての処理となります。 printfを用いていろいろ試した結果、ファイル自体はきちんと読み込めているようなのでfor文を入れたのが原因ではないようなのですが・・・。 ちょっと原因が分からなくて詰まってしまったので、どなたか詳しいかたよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> int main(int argc, char* argv[]){ FILE* fp; char buffer[2048]; char kueri[256]; char* s; char* delimiter = " .,"; //単語の区切れの定義 int i; int flag = 0; /*コマンドラインが正しく入力されているかの確認*/ if(argc < 3){ printf("error1\n"); exit(1); } /*入力されたクエリをkueriに格納する*/ strcpy(kueri,argv[1]); /*英小文字を英大文字に変換する処理を\0まで繰り返す*/ s = kueri; while(*s != '\0'){ *s = toupper(*s); s++; } /*メインループ*/ for(i = 2; i < argc; i++){ /*ファイルを開く*/ if((fp = fopen(argv[i], "r")) == NULL){ printf("error2"); exit(1); } while(fgets(buffer,sizeof(buffer),fp) != NULL){ /*最後に\0を格納する*/ buffer[strlen(buffer)-1] = '\0'; /*英小文字を英大文字に変換する処理を\0まで繰り返す*/ s = buffer; while(*s != '\0'){ *s = toupper(*s); s++; } /*strtokを用いて単語毎に区切っていく(1単語目)*/ s = strtok(buffer,delimiter); if(strcmp(s,kueri) == 0){ printf("入力されたクエリを文書内に発見しました。\n"); printf("file name: %s\n",argv[i]); flag = 1; }else{ /*strtokを用いて単語毎に区切っていく(2単語目以降)*/ while((s = strtok(NULL, delimiter)) != NULL){ if(strcmp(s,kueri) == 0){ printf("入力されたクエリを文書内に発見しました。\n"); printf("file name: %s\n",argv[i]); flag = 1; } } } } fclose(fp); } if(flag == 0){ printf("クエリを文書内に発見できませんでした。\n"); } exit(0); }

  • c言語で文書を読み込み、単語の出現頻度を教える

    c言語の課題で、与えられた文書を読み込んでその中にある単語の出現頻度を教えるプログラミングを作成しているのですが、うまくいきません。 どこが間違っているのでしょうか?? ファイルの中身は As sweet as coat , green , milk And everyone think coat になっており、求めたい回答は buffer[0]=As count=1 buffer[1]=sweet count=1 buffer[2]=as count=1 buffer[3]=coat count=2 buffer[4]=green count=1 buffer[5]=milk count=1 buffer[6]=And count=1 buffer[7]=everyone count=1 buffer[8]=think count=1 Number of words:9 にしたいのです。 プログラミングは #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> typedef struct token_checker{ char * token; int count; }TOKEN_CHECKER; int main(int argc,char* argv[]){ FILE * fp; char buffer[1024]; int numword=0; char * delimiter = " .,"; char * s; TOKEN_CHECKER *t; int j; int i = 0; int flag =0; int find = -1; t=(TOKEN_CHECKER*)malloc(sizeof(TOKEN_CHECKER)*24); if(argc != 2){ printf("Parameter error.\n"); exit(1); } if((fp=fopen(argv[1],"r"))==NULL){ printf("File open error.\n"); exit(1); } while( fgets(buffer,sizeof(buffer),fp)!=NULL){ buffer[ strlen(buffer)-1]='\0'; s = strtok(buffer,delimiter); if(s != NULL){ t[numword].token=s; for(i=0;i<=numword;i++){ if(strcmp(t[numword].token,t[i].token)==0){ t[i].count++ } } printf("buffer[%d]=%s count=%d\n",numword,t[numword].token,t[numword].count); numword++; } while((s=strtok(NULL,delimiter)) != NULL){ t[numword].token=s; for(i=0;i<=numword;i++){ t[numword].count=0; if(strcmp(t[numword].token,t[i].token)==0){ t[i].count++; } } printf("buffer[%d]=%s count=%d\n",numword,t[numword].token,t[numword].count); numword++; } } printf("Number of words:%d\n",numword); free(t); fclose(fp); exit(0); } になっており、実行すると buffer[0]=As count=1 buffer[1]=sweet count=1 buffer[2]=as count=1 buffer[3]=coat count=1 buffer[4]=green count=1 buffer[5]=milk count=1 buffer[6]=And count=1 buffer[7]=everyone count=1 buffer[8]=think count=1 buffer[9]=coat count=1 Number of words:9 となってしまい、coatがカウントされないのです。

  • strtokについて

    strtokを使うにあって注意すべき点がしりたいのですが、 test1やtest2は書き換わるので、変わっては困る場合は あらかじめコピーしておくのは理解しましたが、 strtokをネストして使う場合、(1)で必ずNULLになります。 strtokはネストでは使えないのでしょうか? また、他に注意点があるのでしたら教えてください。 あと、C++では、strtokより便利なものはありますか? char test1[] = "111,222,333"; char test2[] = "333,222,111"; char *p, *q; int flag; p = strtok(test1, ","); while ( p != NULL ) { flag = 0; q = strtok(test2, ","); while ( q != NULL ) { if (0 == strcmp(p, q)) { flag = 1; break; } q = strtok( NULL, ","); } if (flag == 0) { return 1; } p = strtok( NULL, ","); // <------- (1)ここで必ずNULL }

  • 回答No.3
  • Tacosan
  • ベストアンサー率23% (3656/15482)

「出力がうまくいきません」ってのは, 具体的には何がどう「うまくいかない」んですか? flag って名前はやめた方がいい. その「フラグ」が何を意味するのかを考え, その「意味」を表す名前を使うべき. 例えば query1_found みたいにすれば, コメントがなくても意味がわかるし, #1 で指摘されたような「矛盾」も起こしようがない.

共感・感謝の気持ちを伝えよう!

  • 回答No.2

プログラムの書き方に問題がありませんか? 似たような行が多すぎる、ということは、流れが追いにくいということ。 人に聞くよりも、プリントデバッグの手法を学びましょう。 そのためにも、重複行を整理しないと。 何のための、構造型言語なのか? 

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 要するに、同じような処理を繰り返すのであれば 重複した記述ではなく関数などを使って書いた方がいいということでしょうか?

  • 回答No.1
  • asuncion
  • ベストアンサー率32% (1782/5464)

kueriはqueryの方がいいのではないか、というのはさておき…。 >int flag_kueri = 0; //kueri1,kueri2がどちらもあれば1に >/*kueriが両方なかったらflar_kueriを1にする*/ >if(flag_kueri1 == 1 && flag_kueri2 == 1){ > >}else{ >flag_kueri = 1; >} 変数定義のところと実際の処理のところで、 flag_kueriの役割が矛盾しているように見えるのは気のせいでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 確かにコメントアウトにミスがありました。 ご指摘ありがとうございます。 確かに、コメントアウトにミスはあったんですが処理自体は矛盾なく 両方、または片方のクエリが見つからなかった場合にはflag_kueriを1にすることで ファイル名の処理を避けるようにしようと思っているのですが if( flag_kueri1==1 && flag_kueri2==1){ }else{ flag_kueri=1; } とすることで、どちらか一方のクエリが見つからなかった場合はflag_kueriを1にする処理を行い、出力の際には if(flag_kueri == 0){ s=argv[i]; printf("file name: %s\n); } とすることで、flag_kueri=0の時、つまりはどちらか一方、または両方のクエリが見つからなかったことによりflag_kueriを1にする処理は行われずファイル名が出力されるようになっていると思うのですが、いかがでしょうか?

関連するQ&A

  • C言語でファイルの内容を strtok関数 を使って数字と文字を分けて

    C言語でファイルの内容を strtok関数 を使って数字と文字を分けて配列に格納したいのですが、うまくできません。 どこが駄目なのかご指摘をお願いします! ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int i=0; int num[10]; char na[10]; fp=fopen(argv[1],"r"); while(fgets(str,sizeof str,fp)!=NULL); tp = strtok ( str, " " ); while(tp != NULL ) { num[i]=atoi(tp); tp = strtok( NULL," "); if ( tp != NULL ){ na[i]=*tp; } i++; } printf("%d\n%s",num[0],na[0]); printf("%d\n%s",num[1],na[1]); fclose(fp); return 0; }

  • C言語のプログラムについてご指導願えますか?

    ファイルを読み込み、そのなかにI,We,You,He,She,Theyの単語がいくつかるかカウントするプログラムを作成したいのですが、単語のカウントがうまくできません。 下記に作成したソースを記載しますので、間違っている箇所を指摘していただけませんか? #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } if(strcmp("I",fp)==0) { j++; } if(strcmp("We",fp)==0) { k++; } if(strcmp("You",fp)==0) { l++; } if(strcmp("He",fp)==0) { m++; } if(strcmp("She",fp)==0) { n++; } if(strcmp("They",fp)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

  • プログラム高速化について

    http://oshiete1.goo.ne.jp/qa5810041.html で質問させていただいた者です。 ソースは下ので動いているのですが、北海道近辺の郵便番号を調べようとするとすぐに結果が返ってくるのですが、 沖縄県辺りですと少し時間がかかってしまいます。(わずかな差ですが…) 恐らく、上から1個ずつしらみつぶしに調べているのでそのような結果になっているのはわかるのですが… これを高速化するにはwhile文をいじる必要があると思うのですが、どのようにしたら良いでしょうか? 以下がプログラムになります。 ken_all.csvの場所:http://www.post.japanpost.jp/zipcode/dl/kogaki.html #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define NAME "ken_all.csv" #define SIZE 1024 #define setstr(x,z) {strcpy(x,strtok(z,",\""));} struct tb{ //構造体設定 char dummy[SIZE]; //全国地方公共団体コード char old_num[SIZE]; //旧郵便番号 char now_num[SIZE]; //現在の郵便番号 char kana1[SIZE]; //都道府県名(カナ) char kana2[SIZE]; //市区町村名(カナ) char kana3[SIZE]; //町域名(カナ) char kanji1[SIZE]; //都道府県名(漢字) char kanji2[SIZE]; //市区町村名(漢字) char kanji3[SIZE]; //町域名(漢字) }; int main(int argc, char *argv[]) { struct tb line; FILE *fp; char *address, buff[SIZE], string_buff[SIZE]; int flag; clock_t start,end; start = clock(); if(argc == 1){ printf("引数を指定してください\n"); } if(argc > 2){ printf("引数が多すぎます、引数は1つにしてください。\n"); return -1; } if((fp=fopen(NAME,"r"))==NULL){ printf("ファイル%sが開けません\n",NAME); return -1; } flag=0; address = argv[1]; while(fgets(buff,SIZE,fp) != NULL){ //各項目の設定 strcpy(line.dummy,strtok(buff,",\"")); strcpy(line.old_num,strtok(NULL,",\"")); strcpy(line.now_num,strtok(NULL,",\"")); strcpy(line.kana1,strtok(NULL,",\"")); strcpy(line.kana2,strtok(NULL,",\"")); strcpy(line.kana3,strtok(NULL,",\"")); strcpy(line.kanji1,strtok(NULL,",\"")); strcpy(line.kanji2,strtok(NULL,",\"")); strcpy(line.kanji3,strtok(NULL,",\"")); //文字の連結 strcpy(string_buff,line.kanji1); strcat(string_buff,line.kanji2); strcat(string_buff,line.kanji3); //住所の比較 if(strcmp(string_buff,address)==0){ printf("〒%s \n",line.now_num); flag=1; break; } //郵便番号の比較 if(strcmp(line.now_num,address)==0){ printf("%s \n",string_buff); flag=1; break; } } fclose(fp); if(flag==0 && atoi(argv[1]) == 0){ printf("「%s」に該当する郵便番号はありませんでした\n",address); } if(flag==0 && atoi(argv[1]) != 0){ printf("「%s」に該当する住所はありませんでした\n",address); } end = clock(); printf("%.30f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問

    C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問です! ファイルを開いた後でエラーとなるのですが、何が足りないのでしょうか? ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int k,i=0; int num[10]; char na[10][20]; fp=fopen(argv[1],"r"); if(fp==NULL){ printf("ファイルを開けません\n"); return 1; }else{ printf("開けた\n"); } while(fgets(str,sizeof str,fp)!=NULL){ tp=strtok(str," "); num[i]=atoi(tp); tp=strtok(NULL," "); strcpy(na[i],tp); i++; } printf("%d\n%s\n",num[0],na[0]); printf("%d\n%s\n",num[1],na[1]); fclose(fp); return 0; }

  • C言語の質問です

    下記のプログラムはテキストファイルを読み込み、AからZまでの文字(小文字、大文字は区別しない)がそれぞれ何回 現れたかを数えるプログラムです。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int count[26]; int main(int argc, char *argv[]) { FILE *fp; char ch; int i; /* ファイル名の指定を調べる */ if(argc!=2) { printf("ファイル名の指定がありません\n"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } while((ch=fgetc(fp))!=EOF) { ch = toupper(ch); if(ch>='A' && ch<='Z') count[ch-'A']++; } for(i=0; i<26; i++) printf("%c は %d 回出現\n", i+'A', count[i]); fclose(fp); return 0; } 1)int count[26]; で、なぜ26なのかが分かりません。 2)count[ch-'A']++; はどういう動作をするのか詳しく教えてほしいです。 3)よって、for文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

  • 1000000レコードもあるcsvファイルの実績データをC言語で計算しているのですが...

    C言語を学び始めたばかりなのに、csvファイルの実績データでフィールドが15あり、レコード数が1000000近くあるファイルの15番目のフィールドを足し合わせて、出力するということをやっているのですが、まだまだわからないことだらけです。 一応、書いたプログラムが #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char buffer[50],*p; int cnt, num, sum; fp = fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } while(fgets(buffer,fp) != NULL){ p = strtok(buffer,","); cnt = 1; while(p!=NULL){ num = atoi(p); printf("%d:%d,",cnt,num); p = strtok(NULL,","); cnt++; if(cnt==15) sum=sum+num } printf("\b\b \n"); } printf(%d \n",num); fclose(fp); return(0); } と書いたんですが、ぜんぜんな状態です。誰かご教授願えませんか?

  • C言語 strtok

    失礼します。現在こちらでアドバイスを頂きfgetcを使用して配列に格納をすることができたのですが、CSVをカンマ区切りで格納したいのですが上手くいかず困っています。strtokを使用方法をドキュメントを読んでもうまく区切ったものを配列に入れる方法がわかりません 何卒よろしくお願いします。 ソースコード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define MAXITEM 1400 int split(char *str, const char *delim, char *outlist[]) { char *tk; int cnt = 0; tk = strtok(str, delim); while (tk != NULL && cnt < MAXITEM) { outlist[cnt++] = tk; tk = strtok(NULL, delim); } return cnt; } int main(void) { FILE *fp; char *fname = "testfile.csv"; char *tp; char *array[1400]; char *test[11][1400]; char c; int i = 0; int n,y; char *tp[1400]; fp = fopen(fname, "r"); if (fp == NULL) { printf("%sファイルが開けません&#165;n", fname); return -1; } while ((c = fgetc(fp)) != EOF) { array[i] = (char)c; i++; } tp = strtok(array, ","); puts(*tp); while (tp != NULL) { tp = strtok(NULL, ","); if (tp != NULL)puts(tp); } for (n = 0; n < 11; n++) { for (y = 0; y < 1400; y++) { test[n][y] = tp[y]; printf("%c", test[n][y]); } } fclose(fp); return 0; }

  • C言語について教えてください

    ファイルの文を読み込み、I、Weなどの定めた単語の数を数えるプログラムを作りたいのですが、うまくいきません。 具体的な問題点は、単語の数を数える際、一致する単語があった場合、再び最初から文を見直すため、無限ループしてしまう。 We,WE、weなど大文字小文字の違いで単語が数えられないなどです。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int w; char str[50]; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } } fscanf(fp,"%50s",str); for(w=0;w<=j+k+l+m+n+o;w++) { if(strcmp("I",str)==0) { j++; } if(strcmp("We",str)==0) { k++; } if(strcmp("You",str)==0) { l++; } if(strcmp("He",str)==0) { m++; } if(strcmp("She",str)==0) { n++; } if(strcmp("They",str)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

  • csvファイルの実績データをC言語で解析するのですが...

    C言語を学び始めたばかりなのに、csvファイルの実績データでフィールドが15あり、レコード数が1000000近くあるファイルの15番目のフィールドを足し合わせて、出力するということをやっているのですが、まだまだわからないことだらけです。 1レコード目がカラム名なので2レコード目から足し合わせるんですがそこのところもよくわからずじまいで... 一応、書いたプログラムが #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp; char buffer[50],*p; int cnt, num, sum; fp = fopen("j0.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); exit(-1); } while(fgets(buffer,fp) != NULL){ p = strtok(buffer,","); cnt = 1; while(p!=NULL){ num = atoi(p); printf("%d:%d,",cnt,num); p = strtok(NULL,","); cnt++; if(cnt==15) sum=sum+num } printf("\b\b \n"); } printf(%d \n",num); fclose(fp); return(0); } と書いたんですが、ぜんぜんな状態です。誰かご教授願えませんか?

  • ファイルの入出力に関する質問

    CSVファイルを読み込んで、処理をするプログラムを書いています。 しかし、うまくいきません。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムは以下の通りなんですが。。。 strtokはhttp://www9.plala.or.jp/sgwr-t/lib/strtok.html を参考にしました。 どなたかおしえていただけないでしょうか? #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[1000][1000]; char tp[256]; int i=0; if((fp=fopen("in.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); exit(1); } while(fgets(tp,256,fp)!=NULL){ tp=strtok(fp,","); puts(s[i][0]=tp); while (tp != NULL ) { tp = strtok(NULL,","); if (tp= NULL ){ puts(s[i][1]=tp); }}i++; } return(0); }