嗨,我按顺序输入了以下几行:

Date, Time, Price, Volume, Value,

日期采用DD / MM / YY格式,时间采用HH / MM / SS AM / PM格式,而价格,数量和价值是用逗号分隔的数字。

此输入有4000行,“ value”逗号后面有时会出现一个共享代码,例如“ CX”或“ NXXT”。

我的程序无法处理此问题并崩溃。

我需要的是一种忽略“值”后逗号以外的内容并继续阅读下一行的方法。 这将在“ Shares”类中。

以下是我班上的输入流:

类:“日期”

istream & operator >> (istream & input, Date & C) /// An input stream for the day, month and year
{
char delim;
input >> C.day >> delim >> C.month >> delim >> C.year;

return input;   /// Returning the input value
}

上课时间'

istream & operator >> (istream & input, Time & C) /// An input stream for the hour minutes and seconds
{
char delim;
input >> C.hour >> delim >> C.minute >> delim >> C.second;
getline(input,C.ampm,',');

return input;   /// Returning the input value
}

类别“股份”

istream & operator >> (istream & input, Shares & C) /// An input stream for the day, month and year
{
char delim;
input >> C.price >> delim >> C.volume >> delim >> C.value >> delim;

return input;   /// Returning the input value
}

===============>>#1 票数:0

编写一个跳过直到行尾的函数。

void skipEOL(std::istream& in)
{
  int c;
  while ( (c = in.getc()) != '\n' && c != EOF );
}

当您知道需要跳过所有内容直到并包括该行的末尾时,请使用它。

===============>>#2 票数:0 已采纳

看起来,共享是代表不同字段的数据结构。 编写一个函数,以更健壮的方式解析行。 理想情况下,如果“份额”代表一行的数据,则只需将其放在输入字符串的一行中即可。 即使存在其他行,该对象也不需要知道。

无论如何,不​​仅要编写这样的流函数,还远远不够鲁棒。 std :: getline将允许您在分隔符上分割行。 当然,即使使用“ std :: getline”,您仍然最好进行适当的验证。 并且您可以使用各种输入对其进行测试,例如,可以为Shares提供一种从字段中重构线的方法,然后进行单元测试以将其与输入进行比较以验证其是否相同。

看一下torset中的此函数 ,该函数解析tor共识文件中的行,并仅提取ip地址和端口。 它将结果集存储在数据成员std::string _set; ,因为这里并不是将所有字段保留在数据结构中的目的。 请注意,此功能不会进行验证,因为它假定tor共识文件格式正确。 原则上,这是一个危险的假设,理想情况下,您永远不会在生产中运行此假设:

IpsetRestore::IpsetRestore( const std::stringstream& consensusIn, const std::string& setName )

:   consensus    ( consensusIn.str() )
  , setName      ( setName           )
  , _errorCode   ( 0                 )

{
    std::string              line      ;
    std::vector<std::string> fields    ;
    std::string              field     ;
    std::stringstream        lineStream;

    // get each line separately
    //
    while( std::getline( consensus, line ) )
    {
        fields    .clear();
        lineStream.clear();
        lineStream.str  ( line );


        // get each field
        //
        while( std::getline( lineStream, field, ' ' ) )

            fields.push_back( std::string( field ) );


        // only work on lines that interest us
        // sample: "r Unnamed VLNV4cpI/C4jFPVQcWKBtO2EBV8 2013-11-04 22:38:31 76.100.70.54 9001 9030"
        //
        if( fields.size() != 8 || fields[ 0 ] != "r" )

            continue;


        // write add lines in the ipset format
        // add [setName] [ip]:[port]
        // tor uses tcp and ipset defaults to tcp, so we won't put it in
        // fields 6 and 7 are the port fields, so if it's port 0, don't bother
        //
        for( int i = 6; i <= 7; ++i )
        {
            if( fields[ i ] == "0" )

                continue;


            _set.append
            (
                std::string( "add "      )
                .append    ( setName     )
                .append    ( " "         )
                .append    ( fields[ 5 ] )
                .append    ( ":"         )
                .append    ( fields[ i ] )
                .append    ( " -exist\n" )
            );
        }



    if( _set.empty() )
    {
        std::cerr << "Something went wrong, _set is empty. Maybe you passed the wrong inputfile or it was not formatted correctly." << std::endl;

        ++_errorCode;
    }
}

  ask by user2924752 translate from so

未解决问题?本站智能推荐:

1回复

C ++使用多个定界符存储输入文件

我有一个包含以下数据的txt文件: 我实际上如何通过删除多个定界符来存储它们,以便提取数据? 我想要的是读入第一行,并忽略“,”,“ [”和“]”,以便我可以分别存储Point2D,3和2。 然后我去,并继续为第二线等。 此外,有可能做到这一点,让我们说,例如: 第一
1回复

从C ++流中读取特定数量的字符到std :: string

我对大多数C ++都非常熟悉,但我避免的一个领域是IO流,主要是因为我一直在嵌入式系统上使用它们,因为它们不合适。 然而,最近我不得不熟悉它们,而我正在努力找出一些我认为应该简单的东西。 我正在寻找一种相对有效的方法来从C ++流中读取固定数量的字符到std::string 。 我可以
1回复

用C ++读取一个很长的控制台输入

我正在尝试使用std :: cin从控制台读取一个数字列表(空格分隔)。 当输入行超过1023个字符时,以下小工作示例中的第一个“cin >> list [i]”永远不会返回: 此代码对以下输入失败: 但删除最后三个零时工作。 我也试过getline()但没有成功
1回复

在C ++中的一个输入中读取多个命令

这是我要告诉我是否必须张贴所有内容的内容。 我想要的是,如果他们键入“ tcc fcc(enter)”,我想要cube.rotateTopNeg90(),然后cube.rotateFrontNeg90()在打印的多维数据集上工作。 编辑:抱歉,这是我上面的问题,现在命令一次只能运行一个(即:
3回复

使用C ++流读取格式化输入

使用stdio.h ,我可以轻松读取某些格式化的输入,如下所示: 关于这一点的好处是,我真的不必担心字符'x'和后面的'='之间有多少空格,以及其他细节。 在C ++中,它在我看来好像, 可能导致s为"x"或"x=" ,或甚至"x=12"这取决于输入的间隔。 有没有一
2回复

在C ++函数中,如何读取在main()中打开的输入文件?

我觉得这将是一个非常简单的问题,但是我很难找到这种情况的例子。 我有一种算法,它读取输入文件并解析每一行上的所有字符串。 如果第一个字符为0,则它​​将该行上的字符串写入输出文件。 我已经成功实现了main()中的编程,但是我想将其重写为可以从main()中调用的函数(Line_Parse
1回复

C ++,cin如何从输入缓冲区读取? [重复]

这个问题已经在这里有了答案: cin之后使用getline(cin,s) 14个答案 CS学生刚开始使用C ++,我很难理解cin和getline()如何读取数据。 我的理解是cin >>会在输入缓冲区中查找数据,如果找不到,它将提示用户。 然
2回复

C ++读取文本文件,直到特定的分隔符

好的,我有一个巨大的文件,想一次在第一章中阅读。 一章以'$'分隔。 我还不是很熟悉C ++,所以我做了一些我希望在C / C ++中读到的内容。 结果应该很好。 我尚未达到文件结尾。 因此它可能在那里失败。 但是,它似乎看似随机(一致,但在看似随机的位置)。 失败将导致在字
1回复

如何从C ++中的输入读取文件路径,以便可以打开txt文件?

我在c:\\\\....\\mydocuments有一个名为myPoints.txt的文件。 它包含一些x,y点的列表(例如3.4,5.6)。 我正在尝试使用ifstream打开它。 进入文件目录后,我会收到运行时错误,程序将关闭。(例如, c:\\mydocuments\\myPoint
2回复

我想创建一个函数,该函数读取输入的每一行并产生其总和,并使用C ++将其另存为sum.txt

假设我有以下输入: 存储在wow.txt 。 我想创建一个函数,该函数读取输入的每一行并产生其总和,并使用C ++将其另存为sum.txt 。 在输入文件中,我们具有以下内容: 1)我们不知道每行的长度,但是最多有10个整数。 2)每个整数都用空格分隔。 所以