C++ 行中的令牌不';t工作失败c++;

C++ 行中的令牌不';t工作失败c++;,c++,loops,line,token,C++,Loops,Line,Token,以下函数用于名为“_filePath”的文本文件,并尝试将其切割为“;”和“,”分隔的小标记,如下所示: [Mickey M;12034;911416313;M;01a;9001;空;0;13;12;0;CPP,C;MSC,3D;FEND,BEND,SEC;] 当尝试将CPP、C分离为小令牌时,它不会到达下一个令牌,即MSC、3D等等。 我注意到函数甚至没有到达以if(tokNum==1)开头的块 我真的需要帮助,非常感谢 void File::set() { if (_filePat

以下函数用于名为“_filePath”的文本文件,并尝试将其切割为“;”和“,”分隔的小标记,如下所示:

[Mickey M;12034;911416313;M;01a;9001;空;0;13;12;0;CPP,C;MSC,3D;FEND,BEND,SEC;]

当尝试将
CPP、C
分离为小令牌时,它不会到达下一个令牌,即
MSC、3D
等等。 我注意到函数甚至没有到达以
if(tokNum==1)
开头的块

我真的需要帮助,非常感谢

void File::set() {

    if (_filePath.is_open()) {
        while (_filePath.getline(line, 250)) {
            char *token; char *tokeng;
            int tokNum = 0;
            token = strtok(line, ";");
            while (token != NULL) {
                index = 0;
                if (token == "NULL") token = NULL;  

                if (inputType == EMP){
                    if (tokNum == 0){
                        int numWord = seprateElements(token);
                        empKnoledge = new string[numWord];
                        tokeng = strtok(token, ",");
                        while(tokeng != NULL) {
                            empKnoledge[index] = tokeng;
                            index++;
                            tokeng = strtok(NULL, ",");
                        }
                    }

                    if (tokNum == 1){
                        int numWord = seprateElements(token);
                        empAfeild = new string[numWord];
                        tokeng = strtok(token, ",");
                        while(tokeng != NULL) {
                            empAfeild[index] = tokeng;
                            index++;
                            tokeng = strtok(NULL, ",");
                        }
                    }
                    if (tokNum == 2){
                        int numWord = seprateElements(token);
                        empPfeild = new string[numWord];
                        tokeng = strtok(token, ",");
                        while (tokeng != NULL) {
                            empPfeild[index] = tokeng;
                            index++;
                            tokeng = strtok(NULL, ",");
                        }
                    }
                }

                tokNum++;
                token = strtok(NULL, ";");
            }

            numLine++;
        }
    }
    getchar();
}

int seprateElements(char *line) {   // check size of elements in line by counting ','
    int count = 0;
    while (*line++ != '\0') {
        if (*line == ',')   count++;
    }
    return count+1;
}

在C++中有很好的类和函数,例如,和./p> 第一个类是应该用于字符串的类。第二个类是一个在字符串而不是文件上工作的输入流。最后,该函数可用于将一行从流获取到
std::string
对象,但它有一个可选参数,允许它在特殊字符(例如分号)上分隔字段

使用这些函数,您可以

std::string line;
while (std::getline(_filePath, line))
{
    // Put the line into an input string stream
    std::istrimgstream linestream(line);

    std::string name;
    std::string id;
    // ... all other fields in the line
    std::string last_field;  // or whatever you want to name it

    // Now extract all the fields from the line
    std::getline(linestream, name, ';');
    std::getline(linestream, id, ';');
    // ... all other fields
    std::getline(linestream, last_field);  // Last field, no separator needed

    // Some fields contains multiple tokens separated by comma
    // Example extracts token from the last field of the line
    std::istringstream tokenstream(last_field);
    std::string token;
    while (std::getline(tokenstream, token, ','))
    {
        std::cout << "Extracted token '" << token << "'\n";
    }
}
std::字符串行;
while(std::getline(_filePath,line))
{
//将该行放入输入字符串流中
std::istrimgstream linestream(line);
std::字符串名;
std::字符串id;
//…行中的所有其他字段
std::string last_field;//或任何您想命名的名称
//现在从行中提取所有字段
std::getline(linestream,名称“;”);
std::getline(linestream,id,;);
//…所有其他领域
std::getline(linestream,last_字段);//last字段,不需要分隔符
//某些字段包含多个用逗号分隔的标记
//示例从行的最后一个字段提取令牌
std::istringstream令牌流(最后一个_字段);
字符串标记;
while(std::getline(tokenstream,token,,'))
{

std::cout使用字符串标记拆分,请参阅以下代码

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
   char str[]="Mickey M;12034;911416313;M;01a;9001;NULL;0;13;12;0;CPP,C;MSC,3D;FEND,BEND,SEC;";
   char *pch = strtok (str,";,");
  while (pch != NULL)
  {
    cout<<pch<<"\n";
    pch = strtok (NULL, ";,");
  }
   return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
字符str[]=“米奇M;12034;911416313;M;01a;9001;空;0;13;12;0;CPP,C;MSC,3D;FEND,BEND,SEC;”;
char*pch=strtok(str,;,”);
while(pch!=NULL)
{

你试过调试它吗?LOL <代码> Strutok <代码>…这是2015!投票关闭(我们不是调试器)。也就是说,考虑改写代码来执行这些步骤:首先,将输入分成令牌;第二,根据需要分开处理令牌(显然前三个令牌需要特殊处理)。也可以考虑不要使用:<代码>新< /COD>,<代码> Sttok < /C>,原始代码> char *<代码> s,和<代码> GETCHAR 。它们是C++的坏实践/非标准/不安全。什么是<代码>输入类型< /代码>?我只能看到它在代码中使用,没有定义。什么是显示问题的最小代码示例(并且没有更小或更大).oh..我忘了说inputType是一个枚举类型。您应该提到这种方法的性能影响;虽然它们可能不相关,在99%的情况下,这是一个很好的折衷-它们确实存在(您的代码将要进行的额外分配数量非常多,而且分配仍然非常昂贵)。