• 締切済み

CSVを用いた検索プログラム動かし方

#pragma warning( disable: 4996 ) #include <stdio.h> #include <string.h> #include <fstream> using namespace std; typedef struct tagKOTOWAZA{ char japanese[50]; char english[50]; }KOTOWAZA; int main() { char buf[256]; KOTOWAZA c[200]; int i, count; /*ifstream strtok strcpy を使ってファイルを読み込む*/ //=====ここから===== ifstream fin("Book1.csv"); if(fin.is_open()){ //ファイル内容の表示とクローズ for(count=0;fin.getline(buf, sizeof(buf)), !fin.eof();count++){//読み込める間 //printf("%s",buf);デバッグ用 char *p; p = strtok(buf,","); if(p)strcpy(c[count].japanese,p); p = strtok(NULL,","); if(p)strcpy(c[count].english,p); } fin.close(); }else{ printf("ファイルのオープンに失敗しました。\n"); return 1; } //=====ここまで==== return 0; } ここからどうすればCSVファイルに書いた 漢字,English を検索できるのかがわかりません・・・ 言語はC++を使っていますvisualstudio2012を使っています。 どうすればいいのか全く分かりません。 よろしくお願いします。

みんなの回答

回答No.3

/* * Visual C++ 2013 でコンパイル/実行 * cl -EHsc csvsearch.cpp */ #include <iostream> #include <fstream> #include <string> #include <map> #include <array> #include <algorithm> using namespace std; int main() { map<string,string> dictionary; ifstream stream("Book1.csv"); if ( !stream.is_open() ) return -1; string line; while ( getline(stream,line) ) { // "○○○,×××," から "○○○" と "×××" を切り出して key, value とする string::size_type pos; pos = line.find(','); if ( pos == string::npos ) continue; string key = line.substr(0,pos); line = line.substr(pos+1); pos = line.find(','); if ( pos == string::npos ) continue; string value = line.substr(0,pos); // key/valueを辞書に登録 dictionary[key] = value; } // 以下の各keyについて array<string,4> keys = { "りんご", "みかん", "なし", "もも" }; for ( string key : keys ) { // 辞書を検索し、 auto iter = dictionary.find(key); if ( iter != dictionary.end() ) { // あったら出力 cout << "japanese=" << key << ", english=" << iter->second << endl; } else { // なかったら not found cout << "japanese=" << key << " not found" << endl; } } } /* Book1.csv: みかん,orange, りんご,apple, もも,peach, */

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>しかし、上述のソースをwindowsコンソールアプリケーション(からのプロジェクト)でデバッグ無しで実行すると何か入力してください...という状態のコンソールがでてきて、入力するとコンソールが消えてしまいます.... アプリ終了待ちでしょうかね。 「何か入力してください」とか表示されている時点でプロセスは終了していると思われます。 >漢字(林檎)を入力したらappleがかえってくるような 入力処理すらないのですから、無理でしょう。 # というか入力する方法って理解していますかね?

参考URL:
http://dixq.net/forum/viewtopic.php?f=3&t=15598&sid=62b7f8df65ae3e69e35bd743eece5d8c
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「ここからどうすればCSVファイルに書いた 漢字,English を検索できるのかがわかりません・・・」 ってことだけど, そもそも「『漢字,English』を検索」ってどういうこと? そして, どこから検索する?

meteor89
質問者

補足

CSVファイルに 漢字,English 例) 林檎,apple といったものを作成し、そのファイルから 漢字(林檎)を入力したらappleがかえってくるようなプログラムを書きたいのです。 しかし、上述のソースをwindowsコンソールアプリケーション(からのプロジェクト)でデバッグ無しで実行すると何か入力してください...という状態のコンソールがでてきて、入力するとコンソールが消えてしまいます....

関連するQ&A

  • このプログラムの解説を

    C言語の勉強を始めたのですが、質問があります。 下のプログラムをコンパイルしたら   入力ファイル名= と出ますが、これは何を入力すればよいのでしょうか? 何か入力しても「~がオープンできません」と表示されて、これは、自分が持っているファイルを打てばよいのですか?(このプログラム自体も何を意味しているか、まだ理解できていません。) 解説よろしくお願いします。 #include<stdio.h> #include<stdlib.h> main() { FILE *fin; char buf[256]; char filename1[20]; printf("入力ファイル名="); gets(filename1); fin=fopen(filename1,"r"); if(fin==NULL){ printf("%sがオープンできません.\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); }

  • プログラムが~~~!!

    こんにちは。今、プログラム書いてるんですけど目的としては、 1、テキストファイルから文字列を読み込む。(大体数万文字) 2、それを100個ずつに区切る。 3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその 百個の中での割合を示す。 4、さらに次の百個を・・・・ みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが もう、お手上げです。 どなたか、助けてください。 #include<iostream.h> #include<stdio.h> #include<string.h> int main() { char pch[3]; int count=0; FILE *fin; fin=fopen('C:\ahowaki.dat','r'); fscanf(fin,'%s',&pch); cout<<"入力\n"; while(pch){ cin.read(pch,2); if((strcmp(pch,"gc"))==0) count++; if(count>=0 && count<=25) cout<<"Under25%\n"; if(count>=26&& count<=50) cout<<"Under50\n"; if(count>=51&& count<=75) cout<<"Under75%\n"; if(count>=76&& count<=100) cout<<"Under99%\n"; else cout<<"Over100%\n"; } return 0; fclose(fin); }

  • strtok

    strtokにて分解した文字を各変数に格納する場合 char *p; FILE *fp; char buf[1000]; if((fp = fopen("○","r"))==NULL){ return 0; } if(!fgets(buf,1000,fp)) return 0; strcpy(p, buf); number = strtok(p,","); class_type = strtok(NULL,","); name = strtok(NULL,","); subject = strtok(NULL,","); と一行の文字列を各変数に格納しています。 ファイルの一行は以下のような形式になっています。 1,A,山田,数学//番号,クラスタイプ,名前,得意教科 これで各値は変数に格納できています。 しかし このファイルはCSVファイルなのですが、空の欄があると 1,A,,数学というデータがbuf内に入っています。 この場合 number→1 class_type→A name→数学 と空欄の箇所が飛ばされてしまっています。 改善する方法がわからないのですが strtokを使わない方がいいのでしょうか?

  • test.csvの内容

    test.csvの内容 "a","b","c","d" "e","f","g","h" "i","j","k","l" "m","n","o","p" "q","r","s","t" "u","v","w","x" "あ","い","う","え" "か","き","く","け" "さ","し","す","せ" "た","ち","つ","て" とし、真ん中のq,r,s,t以降の内容を表示させたく、下のようなプログラムを作成しました しかし、コンパイル後実行しようとするとエラーになってしまいます。どう直したらよいか教えて頂けますでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME "test.csv" #define SIZE 32 struct tb{ char a[SIZE]; char b[SIZE]; char c[SIZE]; char d[SIZE]; }; int main(void) { struct tb test; FILE *fp; char buff[SIZE]; long pos; pos=ftell(fp); fseek(fp,pos,SEEK_SET); while(fgets(buff,SIZE,fp) != NULL){ //各項目の設定 strcpy(test.a,strtok(buff,",\"")); strcpy(test.b,strtok(NULL,",\"")); strcpy(test.c,strtok(NULL,",\"")); strcpy(test.d,strtok(NULL,",\"")); printf("%s %s %s %s \n",test.a,test.b,test.c,test.d); } }

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

    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; }

  • ひとつのプログラムにしたいのですが

    (1)以前GPSで取得した測位データをRS232C通信でPCに表示するプログラムを作成するに当たって、多くの方に助言を頂けたことでなんとかNMEAデータを表示できるようになりました。 (2)そこで次の段階として、取得したNMEAデータに含まれる”緯度””経度””時刻”の要素のみ取り出して表示する方法として、strtok関数を用いたプログラムを教わり、用意した文章から必要な要素のみを出力する方法も確認できました。 (1)と(2)のプログラムをあわせて、受信したデータから緯度経度時刻のみを表示するプログラムを作成したいのですが、 assignment makes pointer from integer without とコンパイル時に表示されてしまいます。ポインタの受け渡しに問題があるということでしょうか?どのように組み合わせれば受信データから必要なデータを表示できるようになるでしょうか。方法があればご教授お願いします。 以下が(1)と(2)のプログラムです。 (1)受信したデータをRS232C通信でPCに指定した行数表示するプログラム #include<unistd.h> #include<fcntl.h> #include<strings.h> #include<termios.h> #include<stdio.h> #define BAUDRATE B4800 #define MODEMDEVICE "/dev/ttyS0" int main() { int fd, c, res; int i=0; int j=0; struct termios oldtio, newtio; unsigned char buf[512]; if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){ perror(MODEMDEVICE); exit(-1); } tcgetattr(fd, &oldtio); /*シリアルポートの設定を待避*/ bzero(&newtio, sizeof(newtio)); /*新しいポートの設定の構造体をクリア*/ newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);/*ボー:4800*/ newtio.c_iflag = (IGNPAR | ICRNL); newtio.c_oflag = 0; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); while (i==0) { res = read(fd,buf,512); buf[--res]=0; j++; printf("%s\n",buf); //j++; if(j==48)i++; /*NMEAセンテンス1セットは24行(12種と1行ずつのスペース)なのでここでは48行で2セット分のループ*/ } tcsetattr(fd, TCSANOW, &oldtio); close(fd); return(0); } (1)実行結果 $GPRMC,081312,A,3428.9433,N,13549.4905,E,0.0,0.0,060808,6.7,W,A*06 $GPRMB,A,,,,,,,,,,,,A,A* $GPGSA,A,3,03,06,07,,16,,21,,25,27,,,2.3,2.0,1.0*34 ・・と48行このようなNMEAセンテンスを表示します。 (2)NMEAセンテンスから時刻、緯度、経度のみを出力 #include <stdio.h> #include <string.h> #include <math.h> char buf[512]="$GPRMC,143514,A,3428.9468,N,13549.4507,E,0.0,196.2,180708,6.7,W,A*05"; /*緯度経度時刻がすべて含まれているGPRMCからデータを取得したいのでGPRMCのモデルを1行用意*/ void pnmea(void) { int utc; double lat; /*緯*/ double lon; /*経*/ char ew; /*東西*/ char ns; /*南北*/ char stat; char *p; /*一行のNMEAセンテンスから時刻緯度経度のみを取り出すために、strtokで”,”ごとのトークンを得る*/ if ((p=strtok(buf,","))==NULL) return; if (strcmp(p,"$GPRMC")!=0) return; /*センテンスの先頭は$GPRMCか?*/ if ((p=strtok(NULL,","))==NULL) return; sscanf(p,"%d",&utc); if ((p=strtok(NULL,","))==NULL) return; stat=p[0]; if ((p=strtok(NULL,","))==NULL) return; /緯度*/ sscanf(p,"%lf",&lat); if ((p=strtok(NULL,","))==NULL) return; ns=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*経度*/ sscanf(p,"%lf",&lon); if ((p=strtok(NULL,","))==NULL) return; ew=p[0]; if (stat!='A') return; printf("%02d時%02d分%02d秒(UTC) ",utc/10000, (utc%10000)/100, utc%100); if (ns=='N') printf("北緯"); else if (ns=='S') printf("南緯"); printf("%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0)); if (ew=='E') printf("東経"); else if (ns=='W') printf("西経"); printf("%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0)); printf("\n"); } int main(void) { pnmea(); return 0; } (2)実行結果 14時35分14秒(UTC) 北緯34度28.9468分東経135度49.4507分 (1)で得たデータを(2)でGPRMCか判別し、必要な部分を取り出し表示 したいと考えています。よろしくお願いします。

  • gccのオプションは必要ですか?

    ubuntuを使ってc言語の勉強(スーパービギナー編ですが)をしています。 以下のプログラムを実行すると、Segmentation faultが出ます。 以前、-lmのオプションを付けないと、math.hが使えない事が、ありましたが、今回の場合、何か必要でしょうか? #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fin; char buf[256]; char filename1[80]; printf("入力ファイル名="); gets("filename1"); fin = fopen(filename1,"r"); if(fin==NULL){ printf("%sをオープンできません。\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); return 0; }

  • プログラムのご指摘

    ファイルを読み込み、英字のみか、先頭が英字で二文字目以降が英字または数字である文字列を出力するプログラムを作りたいです。 #include<string> #include<fstream> #include<cctype> #include<iostream> int main (){ char c; std::string key; std::ifstream fin( "1234.txt"); if( fin.fail() ){ std::cerr << "ファイルを開けませんでした" << std::endl; exit(1); } while (fin >> get(c)){ if(!isalpha(c)) continue; key = tolower(c); while (fin >> get(c)){ if (!isalnum(c)){ key.unget(); break; } key = tolower(c); } break; std::cout << key; } } このようなプログラムを作りましたが、↓のエラーが出ていました。 どなたご指摘願います。 エラーメッセージ: sou2-1.cpp: In function `int main()': sou2-1.cpp:20: error: `get' undeclared (first use this function) sou2-1.cpp:20: error: (Each undeclared identifier is reported only once for each function it appears in.) sou2-1.cpp:25: error: `unget' undeclared (first use this function)

  • Sortプログラムについて2

    えっと、前回もSortのプログラムについて、質問させていただいたのですが、このプログラムでは、二つのファイルを使ってソートしてるのですが、一つのファイルだけを使って、それに上書きするためにはどうするればいいでしょうか? 下に、ソースを貼っておきます。 #include <iostream> #include <fstream> #include <list> #include <string> using namespace std; int main() { char Str[255]; list<string> str; int count = 0; ifstream in("ttest", ios::binary | ios::in); if (!in){ cout << "入力ファイルが読み込めない" << endl; exit(1); } ofstream out("out", ios::binary | ios::out); if (!out){ cout << "出力ファイルが読み込めない" << endl; exit(1); } while (!in.eof()){ //!!!! in.getline(Str,255); str.push_back(Str); count++; } str.sort(); list<string>::iterator p; p = str.begin(); while(p!=str.end()){ out << *p << endl; p++; } in.close(); out.close(); getchar(); return 0; } よろしくお願いします。

  • ファイルの入出力を行っての文字列反転

    入力した文字列を反転させて出力したいのですが どうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> /* 定数 */ #define DELIMITER "/ ," /* 区切り文字 */ int main(void) { FILE *fin,*fout; char infile[40],outfile[40],s[256],s2[256]; char *token; char *strch[50]; int count = 0; int i; printf("入力ファイル名="); gets(infile); printf("出力ファイル名="); gets(outfile); if( (fin=fopen(infile,"r"))==NULL) { /* 入力ファイルオープン */ printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen(outfile,"w"))==NULL) { /* 出力ファイルオープン */ printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s,256,fin)!=NULL) { /* 入力ファイルから読み込んだデータを */ token = strtok(s, DELIMITER); while (token != NULL) { strch[count] = token; token = strtok(NULL, DELIMITER); count++; } for(i = count; i > 0; i--) { strcat(s2, strch[i]); } fputs(s2,fout); /* 出力ファイルに書き込み */ } fclose(fin); /* 入力ファイルクローズ */ fclose(fout); /* 出力ファイルクローズ */ return 0; }

専門家に質問してみよう