ページ 11

CSVファイルから検索したい 

Posted: 2014年8月25日(月) 06:59
by meteor

コード:

#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;
}
[code/]
何度もすみません。Windowsコンソールアプリケーションで空のプロジェクトに、このソースを入れてデバッグ無しで実行しても、何か入力してください...のコンソールが出てくるだけで入力すると何も帰ってこずにコンソールが消えます。
何がいけないのかが全く分かりません・・・

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 07:10
by 初級者
何も出力している気配がないので、
当然であるような気がします。

タイトルに書いてある
検索
のコードは、どこにありますか?

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 19:42
by meteor
あぁ・・・言われてみれば確かに・・・。
どこに何を書けばばよかったのでしょう・・・。

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 19:54
by 初級者
meteor さんが書きました: どこに何を書けばばよかったのでしょう・・・。
って言われましても、
CSVファイルの中身がわからない
何をどのように検索したいのかわからない
結果をどのように出力したいのかわからない
という「無い無い尽くし」の状態ですので、
だれにもわかりません。

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 20:12
by meteor
つたない文章で申し訳ありません・・・。
CSVの中は

三つ子の魂百まで,As the boy, so the man.

このような文章があり、
このファイル中から単純に文字の完全一致で答えを返すようなプログラムが書きたいです。
三つ子の魂百まで を入力したら
As the boy, so the man.
とかえってくる
コンソール上で表示したいです。

これだけではだめでしょうか・・・
貴重な時間を割いていただいているのに申し訳ないです。

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 20:59
by かずま
参考となるプログラムを提示しますので、よく読んで、
理解できなかったらよく調べて、理解したら説明してください。
それでも分からなかったら、どこが分からないのか質問してください。
解決ボタンを押すだけで逃げてはいけません。
このプログラムが気に入らないなら、
自分で別のプログラムを書いていただいてももかまいません。

コード:

#include <iostream>
#include <fstream>
#include <string>
#include <map>

int main()
{
    using namespace std;

    ifstream fin("Book1.csv");
    if (!fin) return 1;

    map<string, string> data;
    string line;
    while (getline(fin, line)) {
        size_t n = line.find(',');
        if (n == line.npos) continue;
        data[line.substr(0, n)] = line.substr(n+1);
    }
    while (cout << ">> ", getline(cin, line))
        if (data.find(line) != data.end()) cout << data[line] << endl;
}

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 21:43
by meteor
すみません、唐突ですがコンソール上に結果を表示させるのにはprintf 関数は必要ないんでしょうか?

Re: CSVファイルから検索したい 

Posted: 2014年8月25日(月) 22:03
by みけCAT
meteor さんが書きました:すみません、唐突ですがコンソール上に結果を表示させるのにはprintf 関数は必要ないんでしょうか?
はい。printf関数を使用しなくても、puts関数(やputchar関数)などで結果が表示できます。
fprintf関数を使用するのもいいと思います。

Re: CSVファイルから検索したい 

Posted: 2014年8月26日(火) 02:10
by かずま
元のプログラムが ifstream を使っているので
C++ であると判断しましたが、
出力関数を printf しか 知らないということは
C もあまり得意ではないということでしょうか?

では、次のプログラムは理解できますか?

コード:

#include <stdio.h>
#include <string.h>

typedef struct {
    char japanese[50];
    char english[50];
} Kotowaza;

int main(void)
{
    static Kotowaza kotowaza[1000];
    int i, n = 0;
    char buf[256];
    FILE *fp = fopen("Book1.csv", "r");
    if (!fp) return 1; 

    while (n < 1000 && fgets(buf, sizeof buf, fp))
        if (sscanf(buf, "%49[^,],%49[^\n]",
            kotowaza[n].japanese, kotowaza[n].english) == 2) n++;
    fclose(fp);

    while (printf(">> "), fgets(buf, sizeof buf, stdin)) {
        char *p = strchr(buf, '\n');  // 改行文字を見つけて
        if (p) *p = 0;                // それを削除
        for (i = 0; i < n; i++)
            if (strcmp(kotowaza[i].japanese, buf) == 0) break;
        if (i < n) puts(kotowaza[i].english);
    }       
    return 0;
}
わからないところは質問してください。
ちょっとクセのある書き方なので、
理解したら自分の書き方に直してみてください。

Re: CSVファイルから検索したい 

Posted: 2014年8月26日(火) 07:04
by meteor
すいません調べたんですが、どうしても教えてもらいたい箇所がちらほらと・・・
while(n<1000 && fgets(buf,sizeof buf,fp))

この条件に対する繰り返し行う内容は何にあたるのかがわかりません。

Re: CSVファイルから検索したい 

Posted: 2014年8月26日(火) 08:14
by みけCAT
meteor さんが書きました:すいません調べたんですが、どうしても教えてもらいたい箇所がちらほらと・・・
while(n<1000 && fgets(buf,sizeof buf,fp))

この条件に対する繰り返し行う内容は何にあたるのかがわかりません。
その直後の

コード:

        if (sscanf(buf, "%49[^,],%49[^\n]",
            kotowaza[n].japanese, kotowaza[n].english) == 2) n++;
を繰り返すはずです。

Re: CSVファイルから検索したい 

Posted: 2014年8月26日(火) 08:24
by meteor
あぁ!!ありがとうございます!
無事プログラムの動作の確認がとれました・・・。
回答して頂いたみなさん、本当に感謝しています。
時間のない中協力していただきありがとうございました。

Re: CSVファイルから検索したい 

Posted: 2014年8月26日(火) 08:24
by meteor
すみません、解決フラグつけるのを忘れていました。