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
,因为reserve
method 仅分配内存,但未初始化。对象没有任何价值,因为向量中没有添加任何内容。您需要 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 个单独的数组的主要内容,如果未能解决你的问题,请参考以下文章