我必须创建一个程序,它将输出1343名马拉松运动员的各种信息。我必须从csv电子表格中导入数据,所以我选择使用getline函数。我使用简单的递归来填充字符串数组,然后再使用递归来输出数据。但出于某种原因,它只想显示300左右跑步者的数据。下面是代码:
int main(){
string data[1344];
vector<string> datav;
string header;
ifstream infile("C:\\Users\\Anthony\\Desktop\\cmarathon.csv");
int i = 0;
if (infile.is_open()) {
for (i=0; i<=1343; i++) {
getline(infile, data[i]);
}
datav.assign(data, data+1344);
for (int i = 0; i < datav.size(); i++) {
cout << datav[i] << "\n";
}
}
}我尝试使用向量,希望它能帮助分配所需的内存来正确地执行程序(如果这实际上就是这里的问题)。
该代码生成运行程序1045-1343的完美输出。我尝试过简单的工作方法,例如使用几个for()循环无缝地组合输出,但没有效果。如有任何资料,将不胜感激。
发布于 2014-12-09 02:51:39
您不需要从数组复制到向量。您可以直接添加到向量中。此外,在外部范围内隐藏另一个局部变量也是一种不太好的做法。
int main(){
string line;
vector<string> datav;
string header;
ifstream infile("C:\\Users\\Anthony\\Desktop\\cmarathon.csv");
if (infile.is_open()) {
// Are you supposed to read the header line first?
getline( infile, header );
while( getline( infile, line ).good() )
datav.push_back( line );
cout << "Container has " << datav.size() << " lines\n";
for (size_t i = 0; i < datav.size(); i++) {
cout << datav[i] << "\n";
}
}
}当然,您仍然需要将每一行分解到各个字段,因此,按照EToreo的建议将类或结构向后推将是一个好主意。
发布于 2014-12-09 02:39:33
您应该尝试使用struct来表示CSV文件中的字段,然后生成该结构类型的向量。
现在,循环遍历文件,读取每一行直到到达文件的末尾(Google如何做到这一点)--不要假设1343,你不必这么做。当您在每一行中读取时,从您的结构中创建一个新的对象,并将其填充到该行的内容中(您将需要通过读取制表符(\t)或字符串的末尾来解析它),然后将它( datav.push(newObj) )放到您的向量上。
我建议在结构中使用正确的类型(int表示年龄,字符串表示名称,等等)。并将字符串值从文件传递到这些类型。做一些事情要容易得多,比如把每个人的年龄相加。你会感谢你自己(也许是我?)后来。
发布于 2014-12-09 02:44:38
如果您不需要使用向量:
for (i=0; i<=1343; i++) {
cout << data[i] << endl;
}如果要打印出数据数组中的任何内容,如果需要在不同的变量中放置不同的字符串,也可以为getline函数指定一个Ded示波器。
然而,从长远来看,EToreo的方法可能对您更有用。
https://stackoverflow.com/questions/27370493
复制相似问题