C++ 从文件重载向量
我试图将一个文件读入多维向量,但是程序在到达文件中的最后一组数据时收到“向量下标超出范围”错误 文件的格式如下: [指数介于1-10000之间][空格][兰特整数介于1-100之间] 但是,每个索引都可能出现1-50次,因此文件的最终外观如下所示: 以及介于两者之间的所有内容(我重新编写了数据,使其更短,但基础是相同的) 代码如下:C++ 从文件重载向量,c++,file,vector,C++,File,Vector,我试图将一个文件读入多维向量,但是程序在到达文件中的最后一组数据时收到“向量下标超出范围”错误 文件的格式如下: [指数介于1-10000之间][空格][兰特整数介于1-100之间] 但是,每个索引都可能出现1-50次,因此文件的最终外观如下所示: 以及介于两者之间的所有内容(我重新编写了数据,使其更短,但基础是相同的) 代码如下: ifstream file; int frequentCatcher[1000]; int numDistItems = 10000; vector< ve
ifstream file;
int frequentCatcher[1000];
int numDistItems = 10000;
vector< vector<int> > initialVec(numDistItems, vector<int>(50));
file.open("T25.N0.1K.D10K.txt");
for (int i = 0; i <= 999; i++) //This loop sets all cells to 0 to begin.
{
frequentCatcher[i] = 0;
}
if (file.good())
{
int tracId = 1, tracNum = 0; //counters to track position in file
int id, num; //tracks actual data contained in file
while (!file.eof()) //traverse file
{
file >> id; //input from file
file >> num;
if (tracId == id)
{
initialVec[tracId][tracNum] = num;
tracNum++;
}
else
{
tracId++;
tracNum = 0; //reset item number each time a new transaction occurs
initialVec[tracId][tracNum] = num;
tracNum++;
}
}
ifstream文件;
int-frequentCatcher[1000];
整数=10000;
向量initialVec(numditimes,向量(50));
open(“T25.N0.1K.D10K.txt”);
for(int i=0;i>id;//从文件输入
文件>>num;
if(tracId==id)
{
initialVec[tracId][tracNum]=num;
tracNum++;
}
其他的
{
tracId++;
tracNum=0;//每次发生新事务时重置项目编号
initialVec[tracId][tracNum]=num;
tracNum++;
}
}
错误发生在id变为10000时,矢量错误被抛出,程序崩溃。这是在tracNum重置为0后发生的,但是文件仍需要读取10000的所有值并保存它们,然后再继续。这里的问题是假设矢量[i][j]已存在。对于向量,它们是空的,直到您保留一些插槽或将项目推入向量 向量向量可能不是最好的数据类型,因为您不知道当前键的范围。如果您看到索引顺序为1、5、3、2、4,则会出现问题,因为它们不是连续的 依我看,更好的解决方案应该是
std::map
。map
更适合在键范围未知或未按排序顺序排序时进行排序。使用map,您可以测试索引(键)是否存在。如果键不存在,您可以创建一个新向量,并将其与键一起插入到map中
如果键确实存在,则将值推回向量。您应该阅读
而(!file.eof()
。为什么不在循环中调用push\u
,而不是假设向量足够大,可以容纳所有数据?即使使用eof()
问题@ThomasMatthews提到,读取向量不应该以您正在执行的方式进行。如果您真的希望达到10000,请使用推回
,然后在读取所有数据后测试大小。我尝试将while(!file.eof())替换为while(file>>id)这也导致了同样的错误。当使用push.back时,我会删除大小参数,尽管语法是否与普通向量相同,并带有以下内容:initialVec[tracId][tracNum]。push_back(num)?@Dozar更好的容器应该是答案中所述的std::map
,而不是2d向量
,在2d向量中,你不知道第一维度可能有什么范围。即使你尝试过,在设置向量项之前,你从来没有检查过tracId
或tracNum
是否在范围内。你应该真正编程de果断地,永远不要假设你的输入是什么。