我有一个CSVReader类,它具有此功能

vector<UtfChar*> CSVFile::ReadFile(FILE* fp)
{
    //int count = 0;
    Utf8Char buff[256];

    fgets(buff, 256, (FILE*)fp);
      //  count++;

    Utf8Char *token = strtok(buff, ",");
    bvector<UtfChar*> localVec;
    while (token != NULL)
    {
        localVec.push_back(token);
        token = strtok(NULL, ",");
    }
    return localVec;
}


现在,我有另一个类,从中可以调用此函数:

FILE *fp;
fp = fopen("SampleFile.csv", "r");
while((getc(fp)) != EOF)
{
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp);
}


在这里,我正在将localVec的值与我拥有的一组值(char*)进行比较。但是在另一类中,当我尝试访问像localVec[0]或l ocalVec[1]这样的向量时,它却产生了垃圾。
我尝试在CSVReader类本身中进行比较,然后在那里工作。但是我需要在其他类中进行比较,以便可以将相同的CSVReader类用于其他CSV文件。

最佳答案

这里的问题是您有悬空的指针。您创建并填充本地数组

Utf8Char buff[256];

fgets(buff, 256, (FILE*)fp);


然后,您将获得指向该缓冲区不同段的指针

Utf8Char *token = strtok(buff, ",");
bvector<UtfChar*> localVec;
while (token != NULL)
{
    localVec.push_back(token);
    token = strtok(NULL, ",");
}


因此,现在您有了一个充满了指向本地缓冲区各段的指针的向量。从函数返回向量后,本地缓冲区将被销毁。这意味着您现在拥有的所有指针都指向您不再拥有的内存。使用这些指针是未定义的行为,并且是获得垃圾输出的原因。

另请注意,如果使用How can I read and parse CSV files in C++?解析CSV文件,则可以避免所有这些C-ism。

10-08 11:03