C++ 从文件中读取最后两个实例

C++ 从文件中读取最后两个实例,c++,c,file,ifstream,C++,C,File,Ifstream,我有点小问题 我有一个包含大量信息的文件(发布在pastbin上,因为它很长,) 是的,这是一个扑克明星卡日志,但我为自己做了一个奇怪的计算器,我甚至问过扑克明星 当我过滤文件时,我会得到如下结果 过滤代码: getline(failas,line); if( line.find(search_str) != std::string::npos ) { firstCard = line.substr(4); cout &l

我有点小问题

我有一个包含大量信息的文件(发布在pastbin上,因为它很长,)

是的,这是一个扑克明星卡日志,但我为自己做了一个奇怪的计算器,我甚至问过扑克明星

当我过滤文件时,我会得到如下结果

过滤代码:

 getline(failas,line);
    if( line.find(search_str) != std::string::npos )
        {
            firstCard = line.substr(4);
            cout << firstCard << '\n' ;
        }
以此类推,所以我想做的事情是得到最后一张牌(如上面的例子中的12小时和13小时)

我只得到了最后一张卡片(13d) 有什么想法,我怎么能读两行,或者其他什么想法,怎么解决我的小问题

我知道这是一个初学者的问题,但我还没有找到一个合适的答案。

那么你想要最后n张牌吗?然后维护“最后n张卡”列表,并为找到的每一张卡更新该列表

这样:(手工编写的代码)

#包括
#包括
std::列出最后的卡片;
const unsigned int last_n_cards_max=2;
//basic init使代码更简单,可以采用不同的方法
最后一张卡片。向后推(“?”)//懒得编写for(last_n_cards_max)循环;)
最后一张卡片。向后推(“?”;
(循环)
if(line.find(search_str)!=std::string::npos)
{
currentCard=线路子线路(4);

有两种简单的方法可以解决你的问题

  • 扫描整个文件,找出它有多少行(卡片),然后简单地将位置设置为最后一张卡片之前的一行,然后再读取下一张。您将读取最后两张卡片

  • 使用两个指针。将第一个指针设置为第一行,下一个指针设置为first+2。然后遍历整个文件,第二个指针将到达文件末尾(EOF),您的第一个指针将指向最后一张卡之前的一个指针


  • 我假设还有很多代码。发布整个读取循环以及真实的输入文件和相关的输出文件,它们都是所需的和当前显示的表单。这样做,您可能会得到一些答案,但即使这样也有问题。您是说您的第一张卡的值为13d,您希望其他变量为s吗也可以存储12小时?然后你可以使用两个变量并交替更新其中的值。只需在web上提供一些类似的链接:谢谢你,亲爱的先生!:)从不知道列表(该死的学校!)这是一个很好的特性。再次感谢!我更喜欢C++语法,但我想我不能给它。shot@Ufonautas你更喜欢C++语法吗?我是C++专业的,我也喜欢C++,但是我知道用它来做正确的工作。C++类型和过时的接口是一种痛苦。对于这样的解析任务,我直接去Python。(或者甚至是JavaScript与No.js)。如果你不知道最后一种动态语言,我谦恭地建议你学习其中一种,因为它们很好地补充了C++。谢谢!这是一个很棒的想法。需要检查FiMOS或你的哪一个工作得更快:
    ::: 7c 
    ::: 5d 
    ::: 13c
    ::: 7d
    ::: 12h
    ::: 13d
    
    #include <list>
    #include <string>
    
    std::list<std::string> last_n_cards;
    const unsigned int last_n_cards_max = 2;
    
    // basic init to make code simpler, can be done differently
    last_n_cards.push_back( "?" ); // too lazy to write the for(last_n_cards_max) loop ;)
    last_n_cards.push_back( "?" );
    
    (loop)
      if( line.find(search_str) != std::string::npos )
      {
        currentCard = line.substr(4);
        cout << currentCard << '\n';
    
        last_n_cards.push_back(currentCard); // at new card to the end
        last_n_cards.pop_front(); // remove 1 card from the front
        }
    
    // At the end :
    cout << "Last two cards are : " << last_n_cards[0] << " and " << last_n_cards[1] << '\n';