我必须创建一个程序,在马拉松比赛中输出有关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()
循环无缝地组合输出无济于事。任何信息都将不胜感激。
答案 0 :(得分:0)
您应该尝试使用结构来表示CSV文件中的字段,然后创建该结构类型的向量。
现在,循环浏览文件,读取每一行直到你到达文件的末尾(谷歌如何做到这一点) - 不要假设1343,你没必要。当你读入每一行时,从你的结构中创建一个新对象,并用该行的内容填充它(你需要通过读取直到选项卡(\ t)或字符串的结尾)然后再使用datav来解析它。将(newObj)推到你的矢量上。
我建议在结构中使用正确的类型(int表示年龄,字符串表示名称等),并将文件中的字符串值传递给这些类型。做一些像每个人年龄相加的事情要容易得多。你会感谢自己(也许是我?)。
答案 1 :(得分:0)
如果您不需要使用矢量:
for (i=0; i<=1343; i++) {
cout << data[i] << endl;
}
应该可以打印出数据数组中的任何内容 如果需要在不同的变量中放入不同的字符串,也可以为getline函数指定一个分隔符。
然而,从长远来看,EToreo的方法可能对您更有用。
答案 2 :(得分:0)
您无需从数组复制到矢量。您可以直接添加到矢量。另外,在外部范围内遮蔽另一个局部变量是一种不好的做法。
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建议的类或结构将是一个好主意。