Re: [問題] 讀檔:檔案中某欄位有數字和字串
先簡化我的輸入檔案(input.txt):
Name Mike
Sweep 5
Temp 20.1
各位好, 我想既然get_value裡的引述是寫死的, 我又知道key_name回傳的型別,
那何不定義三個get_value函數:
string& Parameter::get_value_S(const key_type& key){
if(key=="Name"){
return Name;
}else {
std::cout << "No such a variable!" << std::endl;
}//End if(key)
}//End of const string& Parameter::get_value_S
int& Parameter::get_value_I(const key_type& key){
if(key=="Sweep"){
return Sweep;
}else {
std::cout << "No such a variable!" << std::endl;
}//End if(key)
}//End of const int& Parameter::get_value_I
double& Parameter::get_value_D(const key_type& key){
if(key=="Temp"){
return Temp;
}else {
std::cout << "No such a variable!" << std::endl;
}//End if(key)
}//End of const double& Parameter::get_value_D
讀檔時, 定義一個讀檔函數:
Parameter &readinput(Parameter& parms){
std::string string1,string2;
ifstream in("input.txt");//Initialize the constructor of in.
ofstream out("output.txt");
if(!in) {
cout << "Cannot open input file.\n";
}
if(!out) {
cout << "Cannot open output file.\n";
}
while(in) {
in >> string1>> string2;
cout << string1 << " " << string2 <<std::endl;
parms.read_value(string1,string2);
}//End while
in.close();
out.close();
return parms;
}//End of Parameter& readinput(Parameter& parms)
其中的read_value()是類別Parameter裡的函數, 定義如下:
void Parameter::read_value(const key_type& key,const key_type& key2){
if(key=="Name"){
std::cout<<"Inside read_value, Name="<<key2<<std::endl;
Name=key2;
}else if(key=="Temp"){
convertFromString(Temp,key2);
std::cout<< "After converting: Temp" << Temp << endl;
}else if(key=="Sweep"){
convertFromString(Sweep,key2);
std::cout<< "After converting: Sweep" << Sweep << endl;
}else {
std::cout << "No such a variable!" << std::endl;
// break;
}//End if(key)
}//End of Parameter::read_value(const key_type& key,const float& v)
其中的convertFromString定義如下:
template <class T1>
void convertFromString(T1 &value, const std::string &s) {
std::stringstream ss(s);
ss >> value;}
而類別Parameter宣告如下:
class Parameter{
public:
typedef std::string key_type;
Parameter(){}
~Parameter(){}
void read_value(const key_type&, const key_type&);
string& get_value_S(const key_type&);
int& get_value_I(const key_type&);
double& get_value_D(const key_type&);
private:
int Sweep;
double Temp;
std::string Name;
};
在main函式裡, 就只定義物件parms和呼叫readinput()即可:
Parameter parms;
parms=readinput(parms);
如此, 在main裡可作測試:
parms.get_value_I("Sweep")就得到整數5;
parms.get_value_D("Temp")就得到double 20.1;
parm.get_value_S("Name")就得到string Mike.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 134.76.93.247
→
10/27 21:06, , 1F
10/27 21:06, 1F
→
10/27 21:08, , 2F
10/27 21:08, 2F
→
10/27 21:09, , 3F
10/27 21:09, 3F
→
10/27 21:10, , 4F
10/27 21:10, 4F
→
10/27 21:10, , 5F
10/27 21:10, 5F
→
10/27 21:10, , 6F
10/27 21:10, 6F
→
10/27 21:11, , 7F
10/27 21:11, 7F
→
10/27 21:11, , 8F
10/27 21:11, 8F
→
10/27 21:13, , 9F
10/27 21:13, 9F
→
10/27 21:14, , 10F
10/27 21:14, 10F
→
10/27 21:15, , 11F
10/27 21:15, 11F
→
10/27 21:15, , 12F
10/27 21:15, 12F
→
10/27 21:15, , 13F
10/27 21:15, 13F
→
10/27 21:16, , 14F
10/27 21:16, 14F
→
10/27 21:16, , 15F
10/27 21:16, 15F
→
10/27 21:17, , 16F
10/27 21:17, 16F
→
10/27 21:20, , 17F
10/27 21:20, 17F
→
10/27 21:20, , 18F
10/27 21:20, 18F
→
10/27 21:21, , 19F
10/27 21:21, 19F
→
10/27 21:21, , 20F
10/27 21:21, 20F
推
10/27 21:24, , 21F
10/27 21:24, 21F
→
10/27 21:25, , 22F
10/27 21:25, 22F
→
10/27 21:26, , 23F
10/27 21:26, 23F
→
10/27 21:32, , 24F
10/27 21:32, 24F
→
10/27 21:34, , 25F
10/27 21:34, 25F
→
10/27 21:35, , 26F
10/27 21:35, 26F
→
10/27 21:57, , 27F
10/27 21:57, 27F
→
10/27 22:06, , 28F
10/27 22:06, 28F
→
10/27 22:10, , 29F
10/27 22:10, 29F
→
10/27 22:11, , 30F
10/27 22:11, 30F
→
10/27 22:11, , 31F
10/27 22:11, 31F
→
10/27 22:21, , 32F
10/27 22:21, 32F
→
10/27 22:32, , 33F
10/27 22:32, 33F
→
10/27 22:32, , 34F
10/27 22:32, 34F
→
10/27 22:33, , 35F
10/27 22:33, 35F
→
10/28 00:11, , 36F
10/28 00:11, 36F
→
10/28 20:08, , 37F
10/28 20:08, 37F
→
10/28 20:09, , 38F
10/28 20:09, 38F
→
10/28 20:10, , 39F
10/28 20:10, 39F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):