/***************************************************************** 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 20001, 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,