分割字串,載入文字
阿新 • • 發佈:2018-11-27
#define _CRT_SECURE_NO_WARNINGS #include <fstream> #include <iostream> #include <assert.h> #include <list> #include <string> #include <vector> #include <string.h> #include <stdlib.h> using namespace std; typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; const char* filename = "test.txt"; const char* ofname = "output.txt"; struct userInfo { userInfo() { ucType = 0; ucNo = 0; ucSlot = 0; ucPort = 0; } userInfo(BYTE type, BYTE No, BYTE slot, BYTE port) { ucType = type; ucNo = No; ucSlot = slot; ucPort = port; } BYTE ucType; BYTE ucNo; BYTE ucSlot; BYTE ucPort; vector<string> users; }; bool isSep(const char& c, const char* sep) { const char* p = sep; while (*p != '\0') { if (*p == c) { return true; } p++; } return false; } int SplitLine(vector<string>& Words, const string& line, const char* sep) { int count = 0; bool isWhitespace = true; int dwStart = -1; int i = 0; string s; for (i=0; i < line.length();++i) { char c = line.at(i); if (isSep(c, sep)) { if (!isWhitespace) { if (dwStart != -1) { s = line.substr(dwStart, i - dwStart); Words.push_back(s); } dwStart = -1; } isWhitespace = true; } else if (isWhitespace) { count++; dwStart = i; isWhitespace = false; } } if (dwStart != -1 && dwStart < i) { s = line.substr(dwStart, i - dwStart); Words.push_back(s); } return count; } int LoadUserInfo(vector<userInfo>& users) { ifstream infile; infile.open(filename, ios::in); assert(infile.is_open()); string s; vector<string> vec; int count = 0; while (getline(infile, s)) { vec.clear(); cout << s << endl; count = SplitLine(vec, s, " \t\n"); if (count < 4) { cout << "Line error." << endl; continue; } userInfo user; user.ucType = atoi(vec.at(0).c_str()); user.ucNo = atoi(vec.at(1).c_str()); user.ucSlot = atoi(vec.at(2).c_str()); user.ucPort = atoi(vec.at(3).c_str()); if (count > 4) { SplitLine(user.users, vec.at(4), ",-"); } users.push_back(user); } infile.close(); return 0; } int SaveUserInfo(vector<userInfo>& users) { ofstream outfile; outfile.open(ofname); const char* seg = "\t"; outfile << "Shelf" << seg << "Slot" << seg << "Port" << seg << "Users" << seg <<endl; vector<userInfo>::iterator iter = users.begin(); for (; iter != users.end(); ++iter) { char out[20]; sprintf(out, "%d-%d", iter->ucType, iter->ucNo); outfile << out << seg; sprintf(out, "%d", iter->ucSlot); outfile << out << seg << seg; sprintf(out, "%d", iter->ucPort); outfile << out << seg << seg; const vector<string>& vs = iter->users; int i = 0; for (; i < vs.size(); ++i) { outfile << vs[i]; if (i != vs.size()-1) { outfile << ","; } } outfile << endl; } outfile.close(); return 0; } int main() { vector<userInfo> users; LoadUserInfo(users); //char* line = "can't find the way to home, aha."; //char* sep = " \t\n"; //vector<string> words; //cout << SplitLine(words, line, sep) << endl; SaveUserInfo(users); getchar(); return 0; }