分割字符串,加载文本

#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;
}


猜你喜欢

转载自blog.csdn.net/Stering13/article/details/51482278