为什么 Utf8Char 的向量值正在发生变化
Why values of vector of Utf8Char is changing?
我有一个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 类本身进行比较,然后它在那里工作。但是我需要在其他类中进行比较,以便我可以对其他CSV文件使用相同的CSVReader类。
这里的问题是你有悬空的指针。 创建并填充本地数组
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, ",");
}
因此,现在您有一个充满指向本地缓冲区每个段的指针的向量。 从函数返回向量后,本地缓冲区将被销毁。 这意味着您现在拥有的所有指针都指向您不再拥有的内存。 使用这些指针是未定义的行为,也是获得垃圾输出的原因。
另请注意,如果您使用如何在C++中读取和解析 CSV 文件?来解析 CSV 文件,则可以避免所有这些 C-ism。
此代码
bvector<UtfChar*> localVec;
意味着您将指针存储在向量中。
这些指针指向一个局部变量,该变量在函数返回时超出范围。
看起来您跳过了从文件中读取的每个字符串中的第一个字符:
while((getc(fp)) != EOF){
bvector<Utf8Char*> localVec = csvFile.ReadFile(fp);
}
是故意的吗?如果是,那么问题就在这里:UTF-8 字符可以具有可变长度(例如,有些用 1 字节表示,有些用 2 个字节表示,依此类推,最多 6 个字节)。如果不进行任何字符串转换,则可以将 UTF-8 字符串逐个字节从一个地方复制到另一个地方,而不必担心字符长度,因为字符串将保持有效。但是,如果您从字符串上切掉第一个字节,那么它就不再是有效的 UTF-8 字符串,并且不能像它一样解释。
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 当父小部件大小发生变化时,如何更改子小部件的大小?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 为什么使用默认构造函数"{}"而不是"= default"存在性能变化?
- 为什么 Utf8Char 的向量值正在发生变化