【问题标题】:c++ read 3 columns from a text file into a 2D array or 3 individual arraysc++ 将文本文件中的 3 列读入 2D 数组或 3 个单独的数组
【发布时间】:2013-05-06 16:19:32
【问题描述】:

我有一个如下所示的文本文件:

173865.385  444879.102  0.299
173864.964  444879.137  0.467
173864.533  444879.177  0.612
173864.113  444879.211  0.798
173863.699  444879.244  1.002
173863.27   444879.282  0.926
173862.85   444879.317  0.974
....
....
....(around 200000 rows)

我正在尝试将每一列放入一个数组中。 现在我有了这些脚本:

int ReadDataFromFile(double * DataList[] ,int DataListCount,string &FileName)
{
    ifstream DataFile;
    int CurrentDataIndex = 0;;
    DataFile.open(FileName.c_str(),ios::in);
    if(DataFile.is_open()==true)
    {
        char buffer[200];
        while(DataFile.getline(buffer,200))
        {
            string strdata;
            stringstream ss(buffer);
            for(int i =0;i<DataListCount;++i)
            {
                getline(ss,strdata,' ');
                DataList[i][CurrentDataIndex] = strtod(strdata.c_str(),NULL);
            }
            ++CurrentDataIndex;
        }
    }
    return CurrentDataIndex;
}


int _tmain(int argc, _TCHAR* argv[])
{
    double a[200000],b[200000],c[200000];
    double* DataList[] = {a,b,c};
    int DataCount = ReadDataFromFile(DataList,3,string("D:\\read\\k0_test.txt"));
    for(int i=0;i<DataCount;++i)
    {
        cout<<setw(10)<<a[i]<<setw(10)<<b[i]<<setw(10)<<c[i]<<endl;
    }
    system("pause");
    return 0;
}

但它总是告诉错误“溢出”。有没有其他方法可以解决这个问题?

【问题讨论】:

  • 您不能只在堆栈上分配 4.8 MB。改用double *a = new double[200000] 等(或者更好的是,使用向量!)
  • 另外,是“大约 200000 行”,还是“肯定少于 200000 行”,还是“可能超过 200000 行”?
  • 我有几个文本文件,它们都有大约 200000 个条目。有些比这个大(但不是太多),有些比这个小。

标签: c++ arrays visual-c++


【解决方案1】:
 double a[200000],b[200000],c[200000];

用完程序的所有堆栈空间,尝试使用std::vector(首选)或使用动态数组,它在堆上分配内存。

例如:(仅限a

vector<double> a;
a.reserve(200000);

或者

vector<double> a(200000);

如果使用动态数组:

double* a = new double[200000];

用完后别忘了释放内存:

delete [] a;

更多信息请参见STL Vector

【讨论】:

  • 我真的不知道如何使用矢量。在这种情况下,您介意给我看一段代码吗?谢谢!
  • 是的。所以vector也是一种类型,和double、float等类似,我理解对了吗?
  • @user2355225 vector 是一个序列 STL 容器,包含 int、double、float 和其他用户定义的类对象。
  • 哎呀,它不起作用。代码中可能还有其他需要更改的地方。我不确定在哪里。
  • @user2355225 将元素放入向量时,请使用push_back,因为reservemethod 仅分配内存,但未初始化。对象没有任何价值,因为向量中没有添加任何内容。您需要 push_back 将元素放入其中。有关如何使用它的更多信息,请参阅STL vector 链接
【解决方案2】:

2 个解决方案:

double a[200000],b[200000],c[200000]; 移到_tmain 之外,以便它们可以成为全局变量。

或者,

将 a,b,c 声明为:

double *a = new double[200000]; 
double *b = new double[200000]; 
double *c = new double[200000];

别忘了通过delete[]释放他们

希望这会有所帮助:)

【讨论】:

  • 谢谢! :) 它有助于。它现在没有崩溃。
  • 但是我的输出有问题。我的代码块中还有什么需要更改的吗?因为现在数组“b”的结果与“a”相同。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2020-01-20
  • 2010-09-29
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多