質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

661閲覧

C++で、先頭に同じ文字列がある行を抽出するプログラムを作りたいです。

a_8888

総合スコア6

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/04/19 15:22

前提

C++で、先頭に同じ文字列がある行を抽出するプログラムを作りたいです。

Test.txtを読み込んで、Out.txtに上記のようなを行を抽出するプログラムを作っています。

該当のソースコード

C++

1 2#include <stdio.h> 3#include <string.h> 4int main(void) 5{ 6char buff[256]; 7//char * strstr(const char *fp1, const char *find); 8char *find = "あ い"; 9FILE *fp1 = fopen("test.txt", "r"), 10*fp2 = fopen("out.txt", "w"); 11 12while (fgets(buff, sizeof(buff), fp1) != NULL) { 13if (strstr(buff, find) != NULL) { 14fputs(buff, fp2); 15} 16} 17fclose(fp1); 18fclose(fp2); 19return 0; 20

##実現したいこと
このプログラムだと、自分で検索したい文字列(ここでは【あ い】)を打たないといけないのですが、自動で同じ文字列を探してくれるプログラムにしたいです。

どうかお力添えをいただきたいです。

因みにプログラムの例として

----------test.txt----------
あ い う え お
か き く け こ
あ い す せ そ
た ち つ て と
か き ぬ ね の

----------out.txt----------
あ い う え お
か き く け こ
あ い す せ そ
か き ぬ ね の

こんな感じに出力出来ればうれしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/04/19 15:34

app apple applepie さて、どれを出力するんですか? それはなぜですか?
a_8888

2020/04/19 15:53

——test.txt—— あ い う え お か き く け こ さ し す せ そ あ い つ て と な に ぬ ね の か き ふ へ ほ ——out.txt—— あ い う え お か き く け こ あ い つ て と か き ふ へ ほ と言った感じに出力出来ればいいなと
episteme

2020/04/19 15:59

そんなことは訊いていない。 頭からどこまで一致すれば"同じ"と判定するのか? 先頭2文字に固定?
a_8888

2020/04/19 17:14

先頭から空白を挟んだ2列目までです。 abc def ghi という行があるとすれば abc def まで一致すれば同じと判断出来れば。
guest

回答2

0

C で書いてみました。

C

1#include <stdio.h> // fopen, fclose, rewind, fgets, fputs, perror 2#include <string.h> // strchr, strcmp, strncpy, strdup 3 4typedef struct { 5 char *key; 6 int count; 7} keytable; 8 9keytable kt[1024]; 10int n = 0; 11 12void add(const char *key) 13{ 14 int i; 15 for (i = 0; i < n; i++) 16 if (strcmp(kt[i].key, key) == 0) { 17 kt[i].count++; 18 return; 19 } 20 kt[n].key = strdup(key); 21 kt[n++].count = 1; 22} 23 24int find(const char *key) 25{ 26 int i; 27 for (i = 0; i < n; i++) 28 if (strcmp(kt[i].key, key) == 0) return kt[i].count; 29 return 0; 30} 31 32char *getkey(const char *buf, char *key) 33{ 34 const char *p = strchr(buf, ' '); 35 if (!p || !(p = strchr(p + 1, ' '))) return NULL; 36 strncpy(key, buf, p - buf); 37 key[p - buf] = '\0'; 38 return key; 39} 40 41 42int main(void) 43{ 44 FILE *fp1 = fopen("test.txt", "r"); 45 if (!fp1) return perror("test.txt"), 1; 46 47 char buf[256], key[256]; 48 while (fgets(buf, sizeof buf, fp1)) 49 if (getkey(buf, key)) add(key); 50 51 rewind(fp1); 52 FILE *fp2 = fopen("out.txt", "w"); 53 if (!fp2) return perror("out.txt"), 2; 54 55 while (fgets(buf, sizeof buf, fp1)) 56 if (getkey(buf, key) && find(key) > 1) fputs(buf, fp2); 57 58 fclose(fp2); 59 fclose(fp1); 60}

本当は key は順次アクセスの表ではなく、ツリー構造かハッシュを使って
検索の高速化をするべきなんですが、分かりやすさを優先してみました。

投稿2020/04/20 19:11

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

foo.cpp

C++

1#include <iostream> 2#include <string> 3#include <fstream> 4#include <map> 5#include <vector> 6 7std::string make_key(const std::string& str) { 8 std::string::size_type pos = 0; 9 pos = str.find_first_of(' ',pos); 10 pos = str.find_first_not_of(' ',pos); 11 pos = str.find_first_of(' ',pos); 12 return str.substr(0,pos); 13} 14 15int main() { 16 std::map<std::string,int> hist; 17 std::ifstream stream("text.txt"); 18 std::vector<std::string> lines; 19 std::string line; 20 while ( std::getline(stream, line) ) { 21 lines.push_back(line); 22 ++hist[make_key(line)]; 23 } 24 for ( const std::string& item : lines ) { 25 if ( hist[make_key(item)] > 1 ) { 26 std::cout << item << std::endl; 27 } 28 } 29}

text.txt

あ い う え お か き く け こ さ し す せ そ あ い つ て と な に ぬ ね の か き ふ へ ほ

実行結果

あ い う え お か き く け こ あ い つ て と か き ふ へ ほ

投稿2020/04/19 23:24

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a_8888

2020/04/20 14:35

回答ありがとうございます。 初歩的な質問かもしれませんが、実行結果のファイルはどこにあるのでしょうか。
episteme

2020/04/20 14:46

ないよ。そのくらい自分でやって。
a_8888

2020/04/20 15:02

正しくない聞き方をしてしまいました。 書いていただいたプログラムを実行しましたが、実行結果がどこに出力されるのかがわからなくて。 Source.cppと同じファイルにtext.txtを置くまでは分かるのですが。
a_8888

2020/04/20 15:08

自己解決しました。 失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問