从文件重载的矢量

时间:2015-12-12 18:54:06

标签: c++ file vector

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

文件格式如下:

[1-10000之间的指数] [空格] [1-100之间的rand int]

然而,每个索引可以在1-50次之间的任何地方发生,因此文件最终看起来像这样:

http://pastebin.com/gvpd1HC0

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

以下是代码:

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++;
        }
    }

错误发生在id变为10000时,向量错误被抛出并且程序崩溃。这是在tracNum重置为0之后,但文件仍然需要读取10000的所有值并保存它们才能继续。

1 个答案:

答案 0 :(得分:0)

这里的问题是假设vector [i] [j]已经存在。对于向量,它们是空的,直到您保留某些插槽或项目推送到向量中。

矢量矢量可能不是最佳数据类型,因为您事先并不知道的范围。如果您看到索引顺序为1,5,3,2,4,则会出现问题,因为它们不是连续的。

恕我直言,更好的解决方案是 using (var wc = new System.Net.WebClient()) { var uri = ("https://en.wikipedia.org/w/api.php?action=query&prop=imageinfo&format=json&iiprop=url&iiurlwidth=400&titles=File%3ALuftbild%20Flensburg%20Schleswig-Holstein%20Zentrum%20Stadthafen%20Foto%202012%20Wolfgang%20Pehlemann%20Steinberg-Ostsee%20IMG%206187.jpg%7CFile%3AHafen%20St%20Marien%20Flensburg2007.jpg%7CFile%3ANordertor%20im%20Schnee%20(Flensburg%2C%20Januar%202014).JPG"); var response = wc.DownloadString(new Uri(uri)); var responseJson = JsonConvert.DeserializeObject<RootObject>(response); foreach(KeyValuePair<string, Pageval> entry in responseJson.query.pages) { var url = entry.Value.imageinfo.First().thumburl; //Do something with url Console.WriteLine(url); } } 。当键的范围未知或不按排序顺序排序时,std::map<int, vector<int> >更适合排序。使用映射,您可以测试索引(键)是否存在。如果密钥不存在,您可以创建一个新的矢量并将其与密钥一起插入到地图中。

如果密钥确实存在,则将值push_back到向量中。