Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从行的最后一次外观开始打印_C++ - Fatal编程技术网

C++ 从行的最后一次外观开始打印

C++ 从行的最后一次外观开始打印,c++,C++,有人能帮我打印从最后一行到最后一行的所有内容吗(这是一条信息)。 在我的文档中,我有3行外观(“这是一个信息”),但我想打印上一行的所有内容。 我不知道如何使用算法来计算该行是否有3次出现,是否在第3行之后全部打印,或者是否有6次出现,是否在第6行之后全部打印,等等 这是我的一些代码 ifstream ifile("D:\\mytext.txt"); input.open("D:\\mytext.txt"); if (input.is_open()

有人能帮我打印从最后一行到最后一行的所有内容吗(这是一条信息)。 在我的文档中,我有3行外观(“这是一个信息”),但我想打印上一行的所有内容。 我不知道如何使用算法来计算该行是否有3次出现,是否在第3行之后全部打印,或者是否有6次出现,是否在第6行之后全部打印,等等

这是我的一些代码

        ifstream ifile("D:\\mytext.txt");
        input.open("D:\\mytext.txt");
        if (input.is_open())
        {

        BEGIN:

            while (getline(input, line))
            {
                if (line.find("**THIS IS ONE INFO**") != string::npos) {
                    cout << "Print line" << line << endl;
                    ++found;
                        }
                        else
                    found == hlp;
                pos = line.find("DATA/DATE");
                pos2 = line.find("PLEASE CONTACT YOUR OFFICE");
                id = line.find("AID:");
               ...........
                if (line == "PLEASE CONTACT YOUR OFFICE") {
                            outFile << "----------------------------------------" << endl;
                            outFile << "\n" << endl;
                            found++;
                            hlp++;
                            cout << "hlp= " << hlp<< endl;
                            cout << "Found= " << found<< endl;
                            goto BEGIN;

                        }.....


您可以通过逐行将数据填充到
std::string
中,并在每次当前行包含所需模式时清除数据(在本例中为“这是一个信息”)来实现这一点

这将导致最终拥有从模式最后一次出现到文件结尾的内容(这是您想要的)


  • 一种可能的实施方式:
结果是(如预期的那样):

foobar
福巴兹


如果您不想立即执行,可以将整个文件读入
std::string
中,然后使用获取所需的数据

这将搜索给定模式的最后一个匹配项,并返回匹配项的第一个字符的位置(或
std::string::npos
,如果没有匹配项)。
此时,您只需将子字符串从该位置提取到末尾


我没有为这个解决方案写一个例子,因为我认为这个想法很琐碎。如果您的情况不是这样,请告诉我,我无论如何都会提供。

谢谢您的回答@Fareanor,但我可以得到该模式的出现次数吗?我试着用计数器,但它计算所有的行数,而不是发生的行数<代码>while(std::getline(ifs,line)){data+=(line+'\n');if(line.find(“这是一个信息”)!=std::string::npos)data.clear();++count;}cout@DDS当然,每次必须清除数据字符串时,只需增加一个计数器。清除的次数是出现的次数:),但在我的例子中,计数器的数目是=8,而不是=2。我明白了,我必须把++计数从
中取出,而()。当然感谢,
data.clear()
++count必须都在
if
条件内。你忘了用大括号把它们包起来。请记住,
if
仅适用于以下不带大括号的指令。因此:
if(line.find(“这是一个信息”)!=std::string::npos){data.clear();++count;}
10:39:42 INFORMATION REPLY NEXT 500 FUNCTION 5000
10:39:48 INFORMATION REQUEST AC A  B 
10:40:04 INFORMATION REPLY NEXT 620 FUNCTION 5000
**THIS IS ONE INFO**
================ INFO ================
2018.07.18 10:23:41  - 4784
IDCR: 1111520
SOLUTION: A:5 B:5 C:5
=================================================
DATA/DATE      TIME     TERMINAL
2019.07.16     20:07:27     ID00302 
----------------------------------------
AID: A11111111111

**************************************

PLEASE CONTACT YOUR OFFICE
----------------------------------------
10:23:09 INFORMATION REQUEST AB
10:23:09 INFORMATION REPLY NEXT 010 FUNCTION 5000
10:40:06 INFORMATION REQUEST    ACCBB
Decline reason message:  Common decline
=================================================
10:22:23 INFORMATION REQUEST AB    C 
10:22:24 INFORMATION REPLY NEXT  FUNCTION 5
10:22:32 INFORMATION REQUEST AA      
10:22:52 INFORMATION REQUEST  A AA CB
10:22:53 INFORMATION REPLY NEXT 104 FUNCTION 2047
**THIS IS ONE INFO**
================ INFO ================
2018.07.18 10:23:41  - 4784
IDCR: 1111520
SOLUTION: A:5 B:5 C:5
=================================================
DATA/DATE      TIME     TERMINAL
2019.07.16     20:07:27     ID00302 
----------------------------------------
AID: A2222222222222

**************************************

PLEASE CONTACT YOUR OFFICE
----------------------------------------
10:23:09 INFORMATION REQUEST AB
10:23:09 INFORMATION REPLY NEXT 010 FUNCTION 5000
10:39:42 INFORMATION REQUEST AA      
10:39:42 INFORMATION REPLY NEXT 500 FUNCTION 5000
10:40:04 INFORMATION REPLY NEXT 620 FUNCTION 5000
10:40:06 INFORMATION REQUEST    ACCBB
**THIS IS ONE INFO**
================ INFO ================
2018.07.18 10:40:41  - 1235
IDCR: 1111220
SOLUTION: A:5 B:5 C:5
=================================================
10:22:23 INFORMATION REQUEST AB    C 
10:22:24 INFORMATION REPLY NEXT  FUNCTION 5
10:22:32 INFORMATION REQUEST AA      
10:22:32 INFORMATION REPLY NEXT 0 FUNCTION 100
10:22:53 INFORMATION REPLY NEXT 104 FUNCTION 2047
DATA/DATE      TIME     TERMINAL
2019.07.16     20:07:27     ID00302 
----------------------------------------
AID: A333333333



PLEASE CONTACT YOUR OFFICE
----------------------------------------
APPROVAL CODE:
Decline reason message:  Common decline
=================================================
int main()
{
    const std::string path_file("path/to/some_data.txt");

    std::ifstream ifs(path_file);
    if(ifs)
    {
        std::string data;
        std::string pattern("THIS IS ONE INFO");

        std::string line;
        while(std::getline(ifs, line))
        {
            data += (line + '\n');
            if(line.find(pattern) != std::string::npos)
                data.clear();
        }

        // Print the desired contents
        std::cout << data;

        ifs.close(); // Optional: If not used, the destructor will perform it.
    }
    else
        std::cout << "[Error] Could not open file: " << path_file << std::endl;

    return 0;
}
foo
THIS IS ONE INFO
bar
baz
**THIS IS ONE INFO**
foobar
foobaz