利用ifstream函数和strtok函数实现对txt文本中分割字符串之后内容的读写

利用ifstream函数和strtok函数实现对txt文本内容的读写

例如某txt文件中内容为:
名称:304不锈钢
属性:金属

只想读取“:”后的内容,请问资深程序员们该如何实现

(每次写的代码均会读取全部内容)

int main()
{
    ifstream in("D:\\test1.txt");
    char buf[1000] = {0};
    in>>buf;
    while(strlen(buf) > 0)
    {
        char *p=strtok(buf,":");
        if(p != NULL)
        {
            p=strtok(NULL,",");
            if(p != NULL)
                printf("%s\n",p);
        }
        in>>buf;
    }
    in.close();
    return(0);
}

给你个通用的字符串拆分

#include <string>
#include <cstring>
#include <vector>
#include <iostream>

using namespace std;
// 把字符串中的小写字母转换成大写,忽略不是字母的字符。
// str:待转换的字符串,支持char[]和string两种类型。
void ToUpper(char *str)
{
    if (str == 0) return;

    if (strlen(str) == 0) return;

    int istrlen=strlen(str);

    for (int ii=0;ii<istrlen;ii++)
    {
        if ( (str[ii] >= 'a') && (str[ii] <= 'z') ) str[ii]=str[ii] - 32;
    }
}

// 删除字符串左边指定的字符。
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteLChar(char *str,const char chr)
{
    if (str == 0) return;
    if (strlen(str) == 0) return;

    char strTemp[strlen(str)+1];

    int iTemp=0;

    memset(strTemp,0,sizeof(strTemp));
    strcpy(strTemp,str);

    while ( strTemp[iTemp] == chr )  iTemp++;

    memset(str,0,strlen(str)+1);

    strcpy(str,strTemp+iTemp);

    return;
}

// 删除字符串右边指定的字符。
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteRChar(char *str,const char chr)
{
    if (str == 0) return;
    if (strlen(str) == 0) return;

    int istrlen = strlen(str);

    while (istrlen>0)
    {
        if (str[istrlen-1] != chr) break;

        str[istrlen-1]=0;

        istrlen--;
    }
}

// 删除字符串左右两边指定的字符。
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteLRChar(char *str,const char chr)
{
    DeleteLChar(str,chr);
    DeleteRChar(str,chr);
}

class CCmdStr
{
public:
    vector<string> m_vCmdStr;  // 存放拆分后的字段内容。

    CCmdStr();  // 构造函数。

    // 把字符串拆分到m_vCmdStr容器中。
    // buffer:待拆分的字符串。
    // sepstr:buffer中采用的分隔符,注意,sepstr参数的数据类型不是字符,是字符串,如","、" "、"|"、"~!~"。
    // bdelspace:拆分后是否删除字段内容前后的空格,true-删除;false-不删除,缺省删除。
    void SplitToCmd(const string buffer,const char *sepstr,const bool bdelspace=true);

    // 获取拆分后字段的个数,即m_vCmdStr容器的大小。
    int CmdCount();
    ~CCmdStr(); // 析构函数。
};


CCmdStr::CCmdStr()
{
    m_vCmdStr.clear();
}

// 把字符串拆分到m_vCmdStr容器中。
// buffer:待拆分的字符串。
// sepstr:buffer字符串中字段内容的分隔符,注意,分隔符是字符串,如","、" "、"|"、"~!~"。
// bdelspace:是否删除拆分后的字段内容前后的空格,true-删除;false-不删除,缺省删除。
void CCmdStr::SplitToCmd(const string buffer,const char *sepstr,const bool bdelspace)
{
    // 清除所有的旧数据
    m_vCmdStr.clear();

    int iPOS=0;
    string srcstr,substr;

    srcstr=buffer;

    char str[2048];

    while ( (iPOS=srcstr.find(sepstr)) >= 0)
    {
        substr=srcstr.substr(0,iPOS);

        if (bdelspace == true)
        {
            memset(str,0,sizeof(str));

            strncpy(str,substr.c_str(),2000);

            DeleteLRChar(str,' ');

            substr=str;
        }

        m_vCmdStr.push_back(substr);

        iPOS=iPOS+strlen(sepstr);

        srcstr=srcstr.substr(iPOS,srcstr.size()-iPOS);

    }

    substr=srcstr;

    if (bdelspace == true)
    {
        memset(str,0,sizeof(str));

        strncpy(str,substr.c_str(),2000);

        DeleteLRChar(str,' ');

        substr=str;
    }

    m_vCmdStr.push_back(substr);

    return;
}

int CCmdStr::CmdCount()
{
    return m_vCmdStr.size();
}

CCmdStr::~CCmdStr()
{
    m_vCmdStr.clear();
}

int main(){
    CCmdStr cmdStr;
    cmdStr.SplitToCmd("content1|@|content2|@|content3|@|content4","|@|");
    for (int i = 0; i <cmdStr.CmdCount() ; ++i) {
        string a =cmdStr.m_vCmdStr[i];
        std::cout<<a<<endl;
    }
    return 0;
}

输出:

img

供参考:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
    char buffer[1024], *token;
    string str;
    ifstream ifs("test.txt");
    if(!ifs){
        cout<<"open file fail!"<<endl;
        return 1;
    }
    while(getline(ifs,str))
    {
        strcpy(buffer,str.c_str());
        token = strtok(buffer,":");
        if(token != NULL)
            token = strtok(NULL,":");
        cout<<token<<endl;
    }
    ifs.close();
    return 0;
}

 

关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:C++ ifstream、sstream按行读取txt文件中的内容,并按特定字符分割,不用strtok