从文件中读取最后两次出现的内容

时间:2013-12-10 09:27:58

标签: c++ c file ifstream

我有一点问题,

我有一个包含大量信息的文件(贴在pastbin上,因为它很长,http://pastebin.com/MPcTMHfd

是的,这是一张PokerStars卡片日志,但我为自己制作了一个奇怪的计算器,我甚至向PokerStars询问过这个。

当我过滤文件时,我会得到类似

的内容

过滤代码:

 getline(failas,line);
    if( line.find(search_str) != std::string::npos )
        {
            firstCard = line.substr(4);
            cout << firstCard << '\n' ;
        }

- 结果:

::: 7c 
::: 5d 
::: 13c
::: 7d
::: 12h
::: 13d

依此类推,所以我想做的就是获得最后一张牌(12h和13h,如上例所示)

我设法获得的是最后一张牌,(13d) 任何想法,我如何阅读两行或任何其他想法如何解决我的小问题?

我知道这是一个初学者的问题,但我在任何地方都找不到合适的答案。

2 个答案:

答案 0 :(得分:1)

所以你想要 n 最后一张牌?然后维护“最后n张卡片”列表并为找到的每张卡片更新它。

就像那样:(手写的代码)

#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';

std::list API在这里http://en.cppreference.com/w/cpp/container/list

注意:您是否考虑过使用C ++之外的其他语言来完成此任务?使用像python这样的动态语言,非性能密集型文件解析可能更容易。

答案 1 :(得分:0)

可以有两种简单的方法来解决您的问题。

  1. 扫描整个文件以确定它有多少行(卡),然后在最后一张卡之前简单地将位置设置为一个并读取它然后再下一个。你将读完最后两张牌。

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