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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

検索

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

C++

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

Q&A

解決済

2回答

8263閲覧

C言語 テキストファイルから内容の検索と表示

noritan

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

検索

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

C++

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

0グッド

0クリップ

投稿2020/06/04 02:31

####C言語 テキストファイルから内容の検索と表示について

以下のテキストファイルの中から名前を検索すると名前、ID、日にち、サービス、金額、支払方法を表示させるプログラミングを作りたいです。名前の検索はstrstrを使用するとできすのですが、ID、日にち、サービス、金額、支払方法を表示させることができません。

テキストデータです。(テキストファイルの画像を添付します)

ID: 123
名前: 太郎
日にち: 04/04/2020
サービス: 液晶交換
金額: 3000円
支払方法: 現金

ID: 456
名前: 健司
日にち: 12/04/2020
サービス: バッテリー交換
金額: 5000円
支払方法: カード

サービスの変更
サービス: 基板修理
金額: 10000円
支払方法: 現金

ID: 789
名前: 翼
日にち: 03/03/2020
サービス: 液晶交換
金額: 3000円
支払方法: カード

名前検索のコードです。

int main()
FILE* fp;
fp = fopen("data.txt", "r");
sfp = fopen("Search_data.txt", "w");
char str[10000];
char searchname[100];
printf("Enter search nane: ");
scanf("%s", searchname);
while (fgets(str, sizeof(str), oldfp))
{
if (strstr(str, searchname) != NULL){
if (strstr(str, searchname) != NULL) {
fputs(str, fp);
}
}
}
fclose(fp);
fclose(sfp);
return 0;
}

テキストファイル名は"data.txt"で、Visual Srudio2019を使用しています。

名前検索で表示させたい情報は以下の通りです。

(太郎で検索の場合)

ID: 123
名前: 太郎
日にち: 04/04/2020
サービス: 液晶交換
金額: 3000円
支払方法: 現金

(健司で検索の場合)

ID: 456
名前: 健司
日にち: 12/04/2020
サービス: バッテリー交換
金額: 5000円
支払方法: カード

サービスの変更
サービス: 基板修理
金額: 10000円
支払方法: 現金

(翼で検索の場合)

ID: 789
名前: 翼
日にち: 03/03/2020
サービス: 液晶交換
金額: 3000円
支払方法: カード

4日ほど考えているのですが全然進展がありません。
皆さんの力を貸してほしいです。

よろしくお願いします。

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

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

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

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

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

maisumakun

2020/06/04 02:32

どうしても「テキストファイル」でなければならないのでしょうか?
yuki23

2020/06/04 02:34

C言語でやる必要はありますか?
kazuma-s

2020/06/04 03:02

ID、日にち、サービス、金額、支払方法を表示させることだけができないのですか? それなら、データの読み込みと strstr を使った名前の検索の部分だけでもよいので、 コンパイル可能なソースコードの追加をお願いします。 質問は編集できます。 ソースコードの貼り付けには ```C と ``` を使用してください。
noritan

2020/06/04 03:15

.txtでC言語を使用したいです。
guest

回答2

0

ベストアンサー

あちこち穴空いてるけどとりあえず動くっちゃー動く

C

1#define _CRT_SECURE_NO_WARNINGS /* disable warning (for VC++) */ 2#include <stdio.h> 3#include <string.h> 4 5int main() { 6 FILE* fp; 7 fp = fopen("data.txt", "r"); 8 char prev[1000]; 9 char str[1000] = { '\0' }; 10 char searchname[100]; 11 printf("Enter search nane: "); 12 scanf("%s", searchname); 13 while ( 1 ) { 14 strcpy(prev, str); 15 if ( fgets(str, sizeof(str), fp) == NULL ) break; 16 // 検索文字列を見つけたら 17 if (strstr(str, searchname) != NULL) { 18 // 直前の行、その行、さらに後続する4行をプリント 19 printf("%s", prev); 20 printf("%s", str); 21 fgets(str, sizeof(str), fp); printf("%s", str); 22 fgets(str, sizeof(str), fp); printf("%s", str); 23 fgets(str, sizeof(str), fp); printf("%s", str); 24 fgets(str, sizeof(str), fp); printf("%s", str); 25 } 26 } 27 fclose(fp); 28 return 0; 29}

投稿2020/06/04 02:56

episteme

総合スコア16614

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

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

Gak

2020/06/04 12:39

一部改善。まったく検証していません。 // 検索文字列を見つけたら if (strstr(str, searchname) != NULL) { // 直前の行、その行、さらに後続する行をID:が出てくるまで printf("%s", prev); printf("%s", str); while(strcmp(str, "ID:", 3)) { if ( fgets(str, sizeof(str), fp) == NULL ) break; printf("%s", str); } }
episteme

2020/06/04 12:56

↑やってみた。"改悪"でした。
Gak

2020/06/04 13:00

それは失礼しました。出力が後続4行固定じゃないからID:まで出せばいいよなーと思ったのですが適当に書いてちゃダメですね。
noritan

2020/06/05 01:47

ありがとうございます。うまく表示させることができました。理解に苦しんだため、時間がたってから返信が遅くなりました。申し訳ございません。
episteme

2020/06/05 02:38

どこで理解に苦しんだですか? コード内コメントで述べてるとおりなんですけど。
noritan

2020/06/05 03:50

printf("%s", prev); printf("%s", str); のところで、なぜ、直前の行を呼び出すことができたのかというところです。
episteme

2020/06/05 03:52

だって直前の一行を(fgetsに先立って)prevにコピーしてるもん。
noritan

2020/06/05 04:01

ありがとうございます とても助かりました
guest

0

コンパイル可能なソースコードを見せてもらえませんでしたね。

C

1#include <stdio.h> // fopen, fclose, fgets, fputs 2#include <string.h> // strstr 3 4int main(void) 5{ 6 FILE *fp = fopen("data.txt", "r"); 7 if (fp == NULL) return perror("data.txt"), 1; 8 9 FILE *sfp = fopen("Search_data.txt", "w"); 10 if (sfp == NULL) return perror("Search_data.txt"), 2; 11 12 printf("Enter search nane: "); 13 char searchname[100]; 14 scanf("%s", searchname); 15 16 char idline[1000], str[1000]; 17 while (fgets(idline, sizeof(idline), fp)) { 18 if (strstr(idline, "ID: ") == NULL) continue; 19 if (fgets(str, sizeof(str), fp) == NULL) break; 20 if (strstr(str, searchname) == NULL) continue; 21 fputs(idline, sfp); 22 fputs(str, sfp); 23 while (fgets(str, sizeof(str), fp) && strstr(str, "ID: ") == NULL) 24 fputs(str, sfp); 25 } 26 fclose(fp); 27 fclose(sfp); 28 return 0; 29}

名前、ID、日にち、サービス、金額、支払方法を表示させるプログラミングを作りたいです。

「プログラムを作りたいです」と書いてほしい。
そうでないと、「作曲を作りたい」とか「読書を読みたい」と同じで気持ち悪い。

投稿2020/06/04 14:14

編集2020/06/04 16:10
kazuma-s

総合スコア8224

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

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

noritan

2020/06/05 01:46

申し訳ございません。strstrの文章を張り付けたつもりだったのですがうまくいっていませんでした。次回から気を付けたいと思います。コードありがとうございます。理解してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問