STD:超出范围内存位置

时间:2013-12-25 08:19:03

标签: c++ structure

我编写了一个程序来读取.csv文件,并将信息存储到一个结构中。我已经创建了一个结构数组,并且我将信息存储在其中,当我尝试运行程序时,它一直让我超出范围内存位置异常。问题出在哪里?

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include "structure.h"

using namespace std;

void main () {
    burgerking *burger;
    burger = new burgerking[7000];
    string line;
    ifstream myfile;
    myfile.open("burgerking.csv"); //opening the csv file
    if(myfile.good())
        cout<<"File is Good to be opened"<<endl;
    int i=0;
    int l=0;   //longitude
    int n=1;   //latutude
    int e=2;   //location
    int ss=3;  //state
    int ad=4;  //address
    int j=0;
    int b=0;
    int kk=0;
    int ll=0;
    int add=0;
    string line1;
    string line2;
    string line3;
    while(!myfile.eof())
    {
        cout<<i;
        getline(myfile,line,',');
        if(i==0)
        {
            burger[j].longitude=line;
            j++;
            l=l+7;
        }
        if(i==l)
        {
            burger[j].longitude=line.substr(16,line.length());
            j++;
            l=l+7;
        }
        if(i==n)
        {
            burger[b].latitude=line;
            n=n+7;
            b++;
        }
        if(e==i)
        {
            burger[kk].location=line;
            kk=kk+1;
            e=e+7;
        }
        if(ss==i)
        {
            burger[ll].state=line;
            ss=ss+7;
            ll++;
        }
        i++;

    }
    myfile.close();
    myfile.open("burgerking.csv");
    int c=0;
    while(!myfile.eof())
    {
        getline(myfile,line,',');
        if(ad==c)
        {

            getline(myfile,line1,',');
            getline(myfile,line2,',');
            getline(myfile,line3,',');
            line3=line3.substr(0,16);
            burger[add].address=line+','+line1+','+line2+','+line3;
            add++;
            ad=ad+4;

        }
        c++;
    }

    ofstream outputfile;
    outputfile.open("output.txt");
    if(outputfile.is_open())
    {
    for(int k=0;k<300;k++)// loop just to check the program output
    {
        outputfile<<'\t'<<'\t'<<k+1<<endl;
        outputfile<<burger[k].longitude<<'\t';
        outputfile<<burger[k].latitude<<'\t';
        outputfile<<burger[k].location<<'\t';
        outputfile<<burger[k].state<<endl<<'\t';
        outputfile<<burger[k].address<<endl<<endl<<endl; //just to check the output 
    }
    }


    outputfile.close();
    myfile.close();
    system("PAUSE");
}

1 个答案:

答案 0 :(得分:1)

你的csv阅读逻辑非常复杂。您应该一次读取一行并分别解析字段。这将为您带来巨大的痛苦:

std::vector<burgerking> burger;
std::string line;
bool first = true;
while (getline(myfile, line)) {
    std::ostringstream fields(line);

    burgerking b;
    getline(fields, b.longitude, ',');
    getline(fields, b.latitude , ',');
    getline(fields, b.location , ',');
    getline(fields, b.state    , ',');

    std::string addr1, addr2, addr3, addr3;
    getline(fields, b.addr1, ',');
    getline(fields, b.addr2, ',');
    getline(fields, b.addr3, ',');
    getline(fields, b.addr4, ',');
    b.address = addr1 + ',' + addr2 + ',' + addr3 + ',' + addr4.substr(0, 16);

    if (!first)
      b.longitude = b.longitude.substr(16);
    first = false;

    burger.push_back(b); // emplace_back() if you're using C++11.
}

你的逻辑中有一些奇怪之处:你以7为增量跳过,但似乎有8个字段(lng,lat,loc,state和4个地址行)。我不知道我是否误读了你的逻辑,或者你有错误,所以你可能需要调整上面的代码以纠正任何误解。

我无法确定当前的迭代逻辑是否是您遇到问题的原因(要分解您使用过的大量变量,特别是无法访问csv文件本身的样本,需要付出太多努力),但它可能是,你应该改变它,即使它不是。