C++ 从行的最后一次外观开始打印
有人能帮我打印从最后一行到最后一行的所有内容吗(这是一条信息)。 在我的文档中,我有3行外观(“这是一个信息”),但我想打印上一行的所有内容。 我不知道如何使用算法来计算该行是否有3次出现,是否在第3行之后全部打印,或者是否有6次出现,是否在第6行之后全部打印,等等 这是我的一些代码C++ 从行的最后一次外观开始打印,c++,C++,有人能帮我打印从最后一行到最后一行的所有内容吗(这是一条信息)。 在我的文档中,我有3行外观(“这是一个信息”),但我想打印上一行的所有内容。 我不知道如何使用算法来计算该行是否有3次出现,是否在第3行之后全部打印,或者是否有6次出现,是否在第6行之后全部打印,等等 这是我的一些代码 ifstream ifile("D:\\mytext.txt"); input.open("D:\\mytext.txt"); if (input.is_open()
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
中,并在每次当前行包含所需模式时清除数据(在本例中为“这是一个信息”)来实现这一点
这将导致最终拥有从模式最后一次出现到文件结尾的内容(这是您想要的)
- 一种可能的实施方式:
福巴兹
如果您不想立即执行,可以将整个文件读入
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