c++ 将文本文件中的 3 列读入 2D 数组或 3 个单独的数组

Posted

技术标签:

【中文标题】c++ 将文本文件中的 3 列读入 2D 数组或 3 个单独的数组【英文标题】:c++ read 3 columns from a text file into a 2D array or 3 individual arrays 【发布时间】: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 个条目。有些比这个大(但不是太多),有些比这个小。 【参考方案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”相同。

以上是关于c++ 将文本文件中的 3 列读入 2D 数组或 3 个单独的数组的主要内容,如果未能解决你的问题,请参考以下文章

Python将文本文件读入2D阵列并访问数据

带有列的 C++ 文本文件到 2D 向量中

在 C++ 中将某种结构化的文本文件读入数组

将文本文件逐行读入并行数组C++

将两列文本文件中的浮点数读入Python中的数组时出错

将文件中的双值数字读入 C++ 中的向量并访问它们的值