2016-07-07 33 views
0

我有一个CSVReader类,它有这个功能为什么Utf8Char的向量值正在改变?

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类中进行比较,然后在那里工作。但是我需要在其他类中进行比较,以便我可以为其他CSV文件使用相同的CSVReader类。

+3

指针和C函数。有什么可以出错的?这是因为你使用了一个缓冲区,所有的矢量元素都引用它,然后它被破坏。请使用C++标准库。 – LogicStuff

+0

它给了什么样的“垃圾”? Utf8Char是如何定义的? – user3684240

+0

@LogicStuff如果程序员不能学习局部变量的范围以及如何处理简单的指针,那么使用C++标准库是无济于事的。 –

回答

2

这里的问题是你有悬挂指针。创建和填充

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。

+0

感谢弥敦道:) – Logan0486

1

此代码

bvector<UtfChar*> localVec; 

意味着你存储指针在您的载体。

那些指针指向一个局部变量当函数返回时超出范围。

0

看起来你跳过每个字符串的第一个字符从文件中读取:

while((getc(fp)) != EOF){ 
    bvector<Utf8Char*> localVec = csvFile.ReadFile(fp); 
} 

它是故意的吗?如果是这样,那么问题在于:UTF-8字符可以具有可变长度(例如一些用1字节表示,其他用2字节等等,最多6字节)。如果你不做任何字符串转换,你可以将UTF-8字符串逐字节地从一个地方复制到另一个地方,而不用担心字符长度,因为字符串将保持有效。但是如果你从字符串中切掉第一个字节,那么它就不再是一个有效的UTF-8字符串,并且不能像它那样被解释。

+0

没有它不是故意的。如何避免它..谢谢BTW – Logan0486

相关问题