c++奇怪的ifstream重赋值错误
C++ weird ifstream reassign value error
我正在学习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);
我不知道你想对数组做什么,但你可以在创建时给出大小(默认为空),你可以随时调整它的大小
相关文章:
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:构造函数中的向量赋值错误
- 两个向量赋值错误
- 需要左值作为赋值错误的左操作数通过 if 语句
- 左值和右值赋值错误
- 在 C++ 中需要左键作为赋值错误的左操作数
- 分配不同类对象时出现赋值错误
- 从字符串数组打印其中一个字符串时出现空指针赋值错误
- 如果我分配给彼此的两个变量都是字符串类型,为什么我会收到这个strcpy赋值错误
- 赋值错误中的非左值
- R 值重载运算符字符串赋值错误
- 加法和赋值错误
- 使用C++时,赋值错误的左操作数需要左值
- 如果右手边包含字符串文字的串联,则C++const std::字符串赋值错误
- c++奇怪的ifstream重赋值错误
- 赋值错误的左操作数需要左值
- Mat OpenCv的赋值错误
- 字符串赋值错误
- Std::swap只读引用赋值错误
- 在子类类中重载基类赋值操作符会导致二义性赋值错误