【问题标题】:Wired output by using getline function to read file使用getline函数读取文件的有线输出
【发布时间】:2014-04-02 13:35:12
【问题描述】:

我的程序是读取一个包含一些销售记录的文件,并将时间、日期、价格、数量等分开。然后将它们中的每一个分别存储在一个向量中。所有记录是:

10/10/2013 04:57:27 PM,5.81,5000,29050.00,LT XT

10/10/2013 04:48:05 PM,5.81,62728,364449.68,SX XT

10/10/2013 04:10:33 PM,.00,0,.00,

10/10/2013 04:10:33 PM,.00,0,.00,

10/10/2013 04:10:33 PM,.00,0,.00,

5 行。

那么我的代码是:

void main()
{
vector<string> date, time, price, volume, value, condition;
int len;

load(date,time,price,volume,value,condition);

len = date.size();

for (int i=0 ; i<len ; i++)
{
    cout << date[i] << endl;
}

cout << "****************************" << endl;

for (int i=0 ; i<time.size() ; i++)
{
    cout << time[i] << endl;
}

}

函数加载的定义是:

void load(vector<string> &object1,
vector<string> &object2,
vector<string> &object3,
vector<string> &object4,
vector<string> &object5,
vector<string> &object6)
{   
    string str1,str2,str3,str4,str5,str6;
    string filename;
    cout << "Enter name of file to read (one word only): ";
    cin >> filename;

ifstream fptr(filename);
if (fptr.rdstate() == 0) // no error open file
{   
    while (!fptr.eof()) 
    { 
        getline(fptr,str1,' ');
        object1.push_back(str1);

        getline(fptr,str2,',');
        object2.push_back(str2);

        getline(fptr,str3,',');
        object3.push_back(str3);

        getline(fptr,str4,',');
        object4.push_back(str4);

        getline(fptr,str5,',');
        object5.push_back(str5);

        getline(fptr,str6,',');
        object6.push_back(str6);
    }
}
else
{  
    cerr << "Could not open file \"" << filename << "\" for reading." << endl; 
}

cout << "- after load function" << endl;
}

然后我得到下面的有线结果。我不知道我错在哪里。

矢量日期的结果(4 个结果应该是 5 并且混合了所有内容):

2013 年 10 月 10 日

5.81,62728,364449.68,SX

.00,0,.00

2013 年 10 月 10 日

向量时间的结果(同样的问题):

04:57:27 下午

XT

2013 年 10 月 10 日下午 4:10:33

04:10:33 下午

【问题讨论】:

  • 程序连线结果的概念有点……奇怪……

标签: c++ readfile getline


【解决方案1】:

您永远不会使用'\n' 作为终止符来执行getline,所以这个 将像任何其他字符一样被读取,作为 “线”。

我个人的偏好是循环阅读完整的 一次一行然后使用std::regex(或boost::regex) 将其分成多个字段。这确保了如果有任何事情发生 一行出错,你立即重新同步 正确地在下一行。

也就是说,第一次调用load,当你阅读 条件(最后一个字段),您阅读"LT XT\n10/10/2013 04:48:05 PM"。下一次调用load,当你尝试 日期,您将阅读"5.81,62728,364449.68,SX",即 说,直到下一个空白。

【讨论】:

  • 但是从我的第二个 getline 开始,我使用逗号分隔字段而不是空格。
  • @user3368506 是,但不是'\n'。如果我理解正确的话,最后一个字段应该以'\n' 结尾。
  • @user3368506 实际上:如果我理解正确,即使没有找到分隔符,every 字段也应该以'\n' 结尾。 getline 无法做到这一点。
  • 感谢您的帮助,实际上我对 std::regex 不熟悉,所以我不知道如何逐行阅读。那么,我需要放一些东西来终止每一行吗?
  • 我以前是不使用和调用函数的,它可以工作,但是使用加载函数,它变得奇怪了。
猜你喜欢
  • 2019-08-07
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2012-06-17
  • 2014-12-21
相关资源
最近更新 更多