【问题标题】:How to use ',' as getline delimiter in c++如何在 C++ 中使用 ',' 作为 getline 分隔符
【发布时间】:2018-10-25 17:41:31
【问题描述】:

这是我的代码。当我使用 '\t' 作为分隔符并带有由 \t 分隔的数据集时,它可以工作,但是当我使用 ',' 和由 ',' 分隔的数据集时,它不起作用。

void TApp::LoadTree(char * fileName){
   ifstream in(fileName);
   char starID[200];
   double dRa,dDec,dU,dG,dR,dI,dZ;
   long w = 0;
   TStar * star;

   if (SlimTree!=NULL){

      if (in.is_open()){
         cout << "\nLoading objects ";
         while(in.getline(starID, 200, ',')){
            in >> dRa;
            in >> dDec;
            in >> dU;
            in >> dG;
            in >> dR;
            in >> dI;
            in >> dZ;
            in.ignore();
            star = new TStar(starID, dRa, dDec, dU, dG, dR, dI, dZ);
            SlimTree->Add(star);
            delete star;
            w++;
            if (w % 10 == 0){
               cout << '.';
            }//end if*/
         }//end while

我尝试读取的数据文件如下所示:

1237645876878180399,15.2062613727499,-1.02188584631684,-9999,-9999,-9999,-9999,-9999

【问题讨论】:

  • 与您的问题无关,但我建议您停止使用流getline 成员函数,而将std::getlinestd::string 一起使用。
  • 阅读后检查流状态以确保您正在阅读。
  • 1237645876878180399,15.2062613727499,-1.02188584631684,-9999,-9999,-9999,-9999,-9999 无法按照您的阅读方式工作。读取csv文件有很多重复项。
  • 无关:star = new TStar(...); SlimTree-&gt;Add(star); delete star; 不寻常。如果Add(star) 存储了指针,delete star; 将使存储的指针无效。如果Add(star) 存储了指向数据的副本,您可以TStar star (...); SlimTree-&gt;Add(&amp;star); 避免动态分配。此外,编译器可能会找到一些额外的优化空间,特别是如果您将 Add 更改为接受引用而不是指针。

标签: c++ fstream ifstream getline


【解决方案1】:

我的猜测是您有一个comma-separated values (i.e. a CSV) 文件,其中逗号分隔所有字段。

那么您的代码将无法正常工作,因为输入运算符 &gt;&gt; 不知道除空格之外的任何其他分隔符。

它使用制表符(或其他空白)作为分隔符,因为 &gt;&gt; 运算符 跳过 前导空白,并在空白处停止读取。


对于 CSV 文件,我通常建议您找到一个库来帮助您阅读和解析它们,因为 CSV 文件看似很简单,但实际上可能包含许多特殊和极端情况,使得阅读它们不平凡。

如果您仍想尝试自己解析它们,那么我真的建议您首先阅读 full lines 并尝试分别解析每一行。然后你必须记住阅读每个字段之间的分隔符。

【讨论】:

  • 如果您真的非常想更改分隔符(例如,请参阅stackoverflow.com/questions/7302996/…),但我支持您的建议。
  • 数据集位于 .txt 文件中 扩展名是什么并不重要。它仍然是一个 CSV 文件。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2013-02-10
  • 2013-10-21
  • 2020-09-08
相关资源
最近更新 更多