C ++在.txt文件中搜索所有出现的字符串并列出所有结果

时间:2014-01-25 12:00:01

标签: c++ iostream

我正在尝试编写一个控制台实用程序来维护.txt格式的法庭日期列表,以便我可以更好,更轻松地跟踪它们。为此,我开始使用我喜欢的一段代码作为模板,然后向上工作。

我遇到的问题是实现一个遍历整个文件的搜索功能,并列出所有找到的字符串出现(即以DDMMYY格式存储的日历类型日期)。

对不起,如果我的编码远远不能被接受,但请记住,我只是一个充满电脑热情的律师! :)

这里没有进一步的jib-jabbing是有问题的代码:

#include "stdafx.h"


using namespace std;

void name();
void ID();

int main()
{
    system("cls");
    system("color 0F");
    int ch1;
    cout << "1 pentru a introduce un termen nou" << endl;
    cout << "2 pentru a cauta o data" << endl; 
    cin >> ch1;
    if (ch1 == 1)
    {
        name();
    }
    else if (ch1 == 2)
    {
        ID();
    }
}

void name()
{
    system("cls");
    string name, salary;
    ofstream worker("termene.txt", ios::app);
    int ID;
    cout << "Termen la instanta : ";
    cin >> name;
    cout << "Data termenului format ZZLLAA : ";
    cin >> ID;
    cout << "Client : ";
    cin >> salary;

    worker << name << " " << ID << " " << salary << endl;
    worker.close();
    cin.get();
    main();
}

void ID()
{
    ifstream worker("termene.txt");
    string name, salary, ID;
    unsigned int curLine = 0;
    string search;
    cout << "Introdu data format ZZLLAA : ";
    cin >> search;
    string line, line2, line3;
    if (worker.is_open())
    {
        while ((getline(worker, line)))
        {

            if (line.find(search, 0) != string::npos)
            {
                cout << "Termen: " << endl;
                cout << line << endl;
                if (line.find(search, 1) != string::npos)
                {
                    getline(worker, line2);
                    cout << "Termen: " << endl;
                    cout << line2 << endl;
                    if (line.find(search, 2) != string::npos)
                    {
                        getline(worker, line3);
                        cout << "Termen :" << endl;
                        cout << line3 << endl;
                    }
                }
                else
                {
                    system("cls");
                    cout << "Bad command or court date." << endl;

                }
            }
            worker.close();
        }
        system("pause");
        main();
    }
}

2 个答案:

答案 0 :(得分:1)

致电main()看起来不是一个好主意。它可能会创建一个无限循环,它将消耗函数调用堆栈。这里的增长受到转义标准输入的限制,但它仍然会超载并且可能会溢出调用堆栈。不好的做法,避免它。在while内创建main()循环。

以下代码将阻止调用堆栈溢出:

int main() {
   while(true) {
      // Branch your code
   }
   return 0;
}

然后,每次在while循环内调用函数时,函数退出时都会释放调用堆栈。因此堆栈不会永远增长,您可以避免堆栈溢出。顺便说一句,提供退出条件而不是创建无限循环更好。

答案 1 :(得分:0)

为什么不使用fgrep?当然这只适用于Unix。

fgrep命令:

  

fgrep命令用于在一个或多个文件中搜索匹配的行   给定的字符串或单词。 fgrep比grep搜索更快,但更少   灵活:它只能找到固定的文本,而不是正则表达式。

我认为您也可以使用UnixUtils在Windows上获取一些命令。