我有一个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。