初心者の学生です。どうぞ宜しくお願いいたします。
学校コードから内線番号を表示するプログラムの課題を解いています。
内線番号を表示する関数のエラーは解決したのですが、検索結果が出せません。エラーも返ってきません。
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
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/24 19:26
2020/10/01 04:22