c++奇怪的ifstream重赋值错误

C++ weird ifstream reassign value error

本文关键字:赋值 错误 ifstream c++      更新时间:2023-10-16

我正在学习c++,遇到了一个非常奇怪的错误:我不明白为什么candidateNum在第一个for循环之后改变。

int main()
{
    int candidateNum;
    int votesArr[] = {};
    string namesArr[] = {};
    ifstream inputStream;
    inputStream.open("votedata.txt");
    inputStream >> candidateNum;
    for (int i = 0; i < 5; i++) {
        inputStream >> namesArr[i];
        inputStream >> votesArr[i];
        cout << i << ", candidateNum: " << candidateNum << endl;
    }
    inputStream.close();
    return 0;
}

这是votedata.txt:

5
Johnson 5000
Miller 4000
Duffy 6000
Robinson 2500
Ashtony 1800

奇怪的是,输出是:

0, candidateNum: 5
1, candidateNum: 4000
2, candidateNum: 4000
3, candidateNum: 4000
4, candidateNum: 4000

candidateNum到底是怎么变的?我进行了测试,发现删除inputStream >> xArr[i]中的任何一行都可以"修复"错误。这怎么可能呢?candidateNum在哪里被重新分配?

在c++中数组是固定大小的,所以:

int votesArr[] = {};

等于:

int votesArr[0];

声明了一个包含0个元素的数组,该数组的大小在该变量存在期间不会改变(另一个数组也是如此)。

所以当你这样做的时候:

inputStream >> votesArr[i];

你在数组的边界之外写,并触发未定义的行为,可能覆盖其他变量的内存,并导致各种不可预测的影响。

我的建议是从旧式数组切换到std::vector:

#include <vector>
std::vector<int> votesArr(5);
...
votesArr.resize(candidateNum);

我不知道你想对数组做什么,但你可以在创建时给出大小(默认为空),你可以随时调整它的大小