題目
跟練習一差不多
只是要將cmd.txt要查詢的成績顯示出來
完整程式碼
#include<iostream>
#include<fstream>
#include<string>
#include <sstream>
#include<vector>
using namespace std;
//二維vector : https://ramihaha.tw/c-program-container-vector-array-linklist/
// : https://shengyu7697.github.io/std-vector/
//文件讀取 : https://blog.csdn.net/guowenyan001/article/details/11231927
//string切割 : https://shengyu7697.github.io/cpp-string-split/
//文件寫入 : https://shengyu7697.github.io/cpp-write-text-file/
//string 轉 int : https://www.programiz.com/cpp-programming/string-int-conversion
vector<string> split(const string &s, char delimiter) {
vector<string> tokens;
string token;
istringstream tokenStream(s);
while (getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
int main(){
//標準分數array
int stander[4]={12,12,8,12};
//存cmd的查詢結果
vector<string> cmdResult;
//1.建立可以存score.txt資料之vector
vector<vector<string>> scoreData;
//2.讀取的score.txt文件內容
ifstream readScore;
readScore.open("score.txt",ios::binary);
//3.將score.txt資料存入scoreDate中
string line; //文件內容一行行讀取
while(getline(readScore,line)){
vector<string> to_scoreData = split(line, ' ');
scoreData.push_back(to_scoreData);
}
readScore.close();
//4.讀取的cmd.txt文件內容
ifstream readCmd;
readCmd.open("cmd.txt",ios::binary);
//5.將score.txt資料存入scoreDate中
string line2; //文件內容一行行讀取
while(getline(readCmd,line2)){
//分析好cmd資料
vector<string> cmd = split(line2, ' ');
string name = cmd[0];
string subject = cmd[1];
//尋找scoreData中符合cmd的資料 存入cmdResult
for(int i=0;i<scoreData.size();i++){
string theName = scoreData[i][0];
if(name == theName){
switch (subject[0])
{
case 'c':
cmdResult.push_back(scoreData[i][1]);
break;
case 'e':
cmdResult.push_back(scoreData[i][2]);
break;
case 'm':
cmdResult.push_back(scoreData[i][3]);
break;
case 's':
cmdResult.push_back(scoreData[i][4]);
break;
default:
break;
}
}
}
}
readCmd.close();
//6.將Scoredata run一次,把入學檢測結果寫入output.txt
ofstream toOutput;
toOutput.open("output.txt");
//無法寫入的處理程序
if (!toOutput.is_open()) {
cout << "Failed to open file.\n";
return 1; // EXIT_FAILURE
}
//可以寫入的程序處理
for(int i=0;i<scoreData.size();i++){
//1為全都過 ,0為沒過
int flag=1;
for(int j=0;j<4;j++){
//string --> int
string score = scoreData[i][j+1];
int scoreInt;
scoreInt= std::stoi(score);
if(scoreInt < stander[i]){
flag=0;
break;
}
}
string name = scoreData[i][0];
//錄取成功的輸出值
if(flag) toOutput << "Hello " << name << ", welcome to NCU CSIE!\n";
//錄取失敗的輸出值
else toOutput << "Sorry, " << name << " can't enter NCU CSIE.\n";
}
//7.印出cmd要求的分數
for(int i=0;i<cmdResult.size();i++){
toOutput << cmdResult[i] << endl;
}
//關掉輸出stream
toOutput.close();
return 0;
}