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

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

新規登録して質問してみよう
ただいま回答率
85.35%
コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

4回答

1492閲覧

C++:データファイル内の検索&表示プログラムでのエラー

aluminium

総合スコア7

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

0グッド

0クリップ

投稿2020/09/23 05:31

編集2020/09/23 16:17

初心者の学生です。どうぞ宜しくお願いいたします。
学校コードから内線番号を表示するプログラムの課題を解いています。

内線番号を表示する関数のエラーは解決したのですが、検索結果が出せません。エラーも返ってきません。
Extension mvp は 内線番号を表示する関数 displayExtension を見に行っているはずですが0を返してきます。
エラー処理は、loadExtensions関数の中でいいのか... それすらもわからないでいます。

お知恵をお借りできれば幸いです。お時間ありがとうございます。

出力画面

イメージ説明

該当のソースコード

C++

1#define _CRT_SECURE_NO_WARNINGS 2#include <iostream> 3#include <cstring> 4#include <cstdio> 5using namespace std; 6 7struct Extension { 8 char m_code[6]; // 学校コード 9 int m_extnum; // 内線番号 10}; 11 12FILE* fptr; 13Extension nums[24]; 14 15bool loadExtensions(); 16void displayExtension(const Extension* mvp); 17bool openFile(const char filename[]); 18void closeFile(); 19bool readExtensionCode(char code[]); 20bool readExtensionNumber(int* extnum); 21void flushkeys(); 22bool yes(); 23 24int main() { 25 Extension mvp; 26 bool done = false; 27 char code[128]; 28 loadExtensions(); 29 cout << "内線番号検索" << endl << endl; 30 while (!done) { 31 cout << "学校コードを入力してください: "; 32 cin >> code; 33 flushkeys(); 34 displayExtension(&mvp); 35 cout << "別の検索をしますか? (Y)es: "; 36 done = !yes(); 37 cout << endl; 38 } 39 cout << "検索を終了します" << endl; 40 return 0; 41} 42 43// バッファクリア 44void flushkeys() { 45 while (cin.get() != '\n'); 46} 47 48// y or Y が入力されたらtrue 49bool yes() { 50 char ch = cin.get(); 51 flushkeys(); 52 return ch == 'y' || ch == 'Y'; 53} 54 55// 内線番号読み込み 56bool loadExtensions() { 57 Extension mv; 58 int snum = 0; // 読み込む学校コードの数用 59 bool ok = true; 60 char code; 61 if (openFile("schools.dat")) { 62 while (ok && snum < 24) { 63 ok = readExtensionCode(mv.m_code) && 64 readExtensionNumber(&mv.m_extnum); 65 if (ok) nums[snum++] = mv; 66 if (!ok) { 67 cout << code << " という学校コードは見つかりませんでした" << endl; 68 } 69 70 } 71 closeFile(); 72 } 73 return snum == 24; 74} 75 76// 内線番号表示 77void displayExtension(const Extension* mvp) { 78 cout << "333 444 5050 x " << mvp->m_extnum << endl; 79} 80 81// ファイルオープン 82bool openFile(const char filename[]) { 83 fptr = fopen(filename, "r"); 84 return fptr != NULL; 85} 86 87// ファイルクローズ 88void closeFile() { 89 if (fptr) fclose(fptr); 90} 91 92// 学校コードを読み込み成功したらtrueを返す 93bool readExtensionCode(char code[]) { 94 return fscanf(fptr, " %[^|]|", code) == 1; 95} 96 97// 内線番号を読み込み成功したらtrueを返す 98bool readExtensionNumber(int* extnum) { 99 return fscanf(fptr, "%d|", extnum) == 1; 100}

データファイル(schools.dat)

AFS| 12345 HTM| 23456 IBM| 34567 LHR| 45678 LPOA| 54321 ELI| 45673 ASC| 98325 ELS| 39512 CAA| 40032 FSN| 81944 MKT| 29401 MDA| 24911 CSS| 33091 ECE| 91223 HSS| 19834 NRS| 99331 PSF| 98765 RES| 87654 SAV| 76543 BSAC| 65432 EMET| 54541 FPET| 34332 ITAS| 11245 SDDS| 24234

補足情報

このサイトでコンパイルしました。
https://www.onlinegdb.com/online_c_compiler

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

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

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

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

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

guest

回答4

0

main で、入力された code を使って検索することなしに、
未初期化の mvp の値を表示しています。

追記
C++ なら map を使うと簡単になります。

C++

1#include <iostream> 2#include <fstream> // ifstream 3#include <string> 4#include <map> 5using namespace std; 6 7int main() 8{ 9 ifstream ifs("schools.dat"); 10 if (!ifs) return 1; 11 12 map<string, string> extention; 13 string code, extnum, yes; 14 while (ifs >> code >> extnum) { 15 code.erase(code.end() - 1); // '|' の削除 16 extention[code] = extnum; 17 } 18 cout << "内線番号検索\n\n"; 19 do { 20 cout << "学校コードを入力してください: "; 21 cin >> code; 22 auto i = extention.find(code); 23 if (i == extention.end()) 24 cout << code << " という学校コードは見つかりませんでした\n"; 25 else 26 cout << "333 444 5050 x " << i->second << endl; 27 cout << "他の検索をしますか? (Y)es: "; 28 cin >> yes; 29 } while (yes[0] == 'y' || yes[0] == 'Y'); 30 cout << "検索を終了します\n"; 31}

投稿2020/09/24 00:56

編集2020/09/26 11:15
kazuma-s

総合スコア8224

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

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

aluminium

2020/09/24 19:26

ありがとうございます。何となく間違ったことをしていることに気づいてきました... 最初のコードに立ち戻ってやり直してみます。
aluminium

2020/10/01 04:22

追加で回答をいただきありがとうございました。(お返事が遅くなり申し訳ありません…) mapというのがあるのですね… 勉強します。 ベストアンサーにしたかったのですが、自己解決で処理したところ、 なぜか自分の回答がベストになってしまい、大変失礼しました…
guest

0

エラーメッセージの通り,
関数displayExtension()の引数の型と,呼び出し箇所で引数に渡している物の型が違っている.

どう直すべきかは何をどうしたいのかによる.

投稿2020/09/23 05:41

fana

総合スコア11996

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

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

aluminium

2020/09/23 16:18

ありがとうございます。教えていただいたとおりエラーは解決できました。今度はロジックが間違っているようで、意図した動きになりません。質問を編集しましたので、お時間がありましたら見ていただけると大変助かります。宜しくお願いいたします。
guest

0

引数の型があってないというエラーです

void displayExtension(const Extension* mvp);

これにあってるかをチェックしましょう

投稿2020/09/23 05:40

y_waiwai

総合スコア88042

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

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

aluminium

2020/09/23 16:18

ありがとうございます。教えていただいたとおりエラーは解決できました。今度はロジックが間違っているようで、意図した動きになりません。質問を編集しましたので、お時間がありましたら見ていただけると大変助かります。宜しくお願いいたします。
guest

0

自己解決

最初のコードに立ち戻って、ひととおり動くようにはなったのですが、
スタックオーバーフローになってしまい(まだ)課題の送信ができないでいます...。
引き続きご教示のほど宜しくお願いします。
https://teratail.com/questions/294010

投稿2020/09/25 05:20

aluminium

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問