尝试读入文件时堆坏了

时间:2018-02-08 01:05:08

标签: c++ heap cin corruption

让我带你快速了解我的代码尝试做什么。我正在获取.txt文件并将其读入我的程序,因此我可以将数据存储在我的项目中的DataFrame类中。这里的代码块中的第一个读取就是这样,并且读入就好了。 (处理colNames的代码块)

char** colNames;
int j = 0;
colNames = new char*[c];
for (int i = 0; i < 100; i++) { //I am assuming that each name is no more thann 100 characters
    colNames[i] = new char[100];
}
for (int i = 0; i < c; i++) {
    cin.get(strg); //read the first character
    j = 0;
    do {
        colNames[i][j++] = strg;
        cin.get(strg);
    } while ((strg != ',') && (strg != '\n'));
    colNames[i][j] = '\0';
    (*firstDF).setColName(i, colNames[i]);
}

char** rowNames;
j = 0;
rowNames = new char*[r];
for (int i = 0; i < 100; i++)
{
    rowNames[i] = new char[100];
}

for (int i = 0; i < r; i++)
{
    cin.get(strg);
    do
    {
        rowNames[i][j++] = strg;
        cin.get(strg);
    } while ((strg != ',') && (strg != '\n'));
    rowNames[i][j] = '\0';
    (*firstDF).setRowName(i, rowNames[i]);
}

但是当我复制它并将其粘贴到它下面以重做基本上相同的过程但是对于我的行,我得到堆损坏错误并且我的程序崩溃。我无法弄清楚为什么要这样做以及发生了什么。

如果你有两个独立的阵列以任何方式相互冲突,你可以帮助我理解为什么会这样做。这太棒了。我感谢任何人都能给我的帮助。

1 个答案:

答案 0 :(得分:2)

您分配大小为cr的数组,但是通过100个元素迭代这两个数组。最后一个循环不会重置j

替换第一个

for (int i = 0; i < 100; i++) 

for (int i = 0; i < c; i++) 

替换第二个

for (int i = 0; i < 100; i++)

for (int i = 0; i < r; i++)

替换最后一个循环

for (int i = 0; i < r; i++)

for (int i = 0, j = 0; i < r; i++, j = 0)

如果您假设每个名称不超过100个字符,则应在j < 99 - 条件中添加while。我使用了99,因为第100个字符是为\0保留的。

每个delete[]

后请勿忘记new []

避免使用new语句。您正在使用C ++,并且使用手动内存管理失去了很多好处。 而不是char**new char*[]以及new char使用std::vector<std::string>>。更多其他因为您使用固定大小的数组,在堆栈中使用char[100]而不是堆中的new char[100]