Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件重载向量_C++_File_Vector - Fatal编程技术网

C++ 从文件重载向量

C++ 从文件重载向量,c++,file,vector,C++,File,Vector,我试图将一个文件读入多维向量,但是程序在到达文件中的最后一组数据时收到“向量下标超出范围”错误 文件的格式如下: [指数介于1-10000之间][空格][兰特整数介于1-100之间] 但是,每个索引都可能出现1-50次,因此文件的最终外观如下所示: 以及介于两者之间的所有内容(我重新编写了数据,使其更短,但基础是相同的) 代码如下: ifstream file; int frequentCatcher[1000]; int numDistItems = 10000; vector< ve

我试图将一个文件读入多维向量,但是程序在到达文件中的最后一组数据时收到“向量下标超出范围”错误

文件的格式如下:

[指数介于1-10000之间][空格][兰特整数介于1-100之间]

但是,每个索引都可能出现1-50次,因此文件的最终外观如下所示:

以及介于两者之间的所有内容(我重新编写了数据,使其更短,但基础是相同的)

代码如下:

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果断地,永远不要假设你的输入是什么。