/***************************************************************** Name : 讀取特定格式文件 Date : 2017/06/06 By : CharlotteHonG Final: 2017/06/06 *****************************************************************/ #include <iostream> #include <fstream> #include <string> #include <vector> #include <cctype> using namespace std; constexpr char file_name[] = "text2.txt"; auto ReadFile(string file_name) { vector<string> v; fstream fs(file_name, ios::in); for(string str; fs >> str;) { v.emplace_back(str); } fs.seekg(0, fs.beg); fs.close(); return v; } auto Data_Slice(vector<string>& v) { vector<vector<string>> data; size_t item_len = 0, idx = 0, line_len=0; size_t end_mode = 0; // 0.補0; 1.補英文 // 補數字 auto Append_Num = [&]() { if(!isalpha(v[idx + 1][0])) // 下一個是數字就接著補上 data[line_len-1][data[line_len-1].size()-1] += v[++idx]; --item_len; }; // 開始處理 for(; idx < v.size()-2; ++idx) { // 是頭長度時 if(item_len == 0){ ++line_len; item_len = stoi(v[idx]); data.emplace_back(vector<string> {v[idx]}); } // 非頭長度是英文遞減 else if(isalpha(v[idx][0])) { data[line_len-1].emplace_back(v[idx]); if(item_len == 1) { // 最後一個檢查 if(isalpha(v[idx + 2][0])) { // 最後一組缺數字 --item_len; end_mode = 1; continue; } } Append_Num(); // 補數字 end_mode = 0; } } // 結尾處理 if(item_len==1 and end_mode ==0) { // 補一組 data[line_len-1].emplace_back(v[idx]); Append_Num(); } else { if(end_mode==0) { data.emplace_back(vector<string> {v[idx]}); // 補 0 } else { data[line_len-1].emplace_back(v[++idx]); // 補英文 } } return data; } int main(int argc, char const *argv[]) { vector<string> list; for(string str; cin >> str;) list.emplace_back(str); //auto list = ReadFile(file_name); auto data = Data_Slice(list); // 查看二維陣列 for(auto&& j : data) { for(auto&& i : j) { cout << i << ", "; }cout << endl; } }
1 xy 2 2 z xy 5 R 1004 I 5678 E 2000 R 8002 E 7001 0 1 z 6 R 8001 E 1000 E 1000 E 3000 R 1002 A 1010 0 1 z 2 R 5001 E 4000 1 z 2 2 xy z 3 A 8000 E 1001 E 2000
1, xy2, 2, z, xy, 5, R1004, I5678, E2000, R8002, E7001, 0, 1, z, 6, R8001, E1000, E1000, E3000, R1002, A1010, 0, 1, z, 2, R5001, E4000, 1, z2, 2, xy, z, 3, A8000, E1001, E2000,