输出不显示所有信息C ++

时间:2014-12-09 02:23:25

标签: c++ arrays vector cmd cout

我必须创建一个程序,在马拉松比赛中输出有关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()循环无缝地组合输出无济于事。任何信息都将不胜感激。

3 个答案:

答案 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建议的类或结构将是一个好主意。