我们知道文件的从头到尾按行读取是非常方便的。但是,有的时候我们只需要文件的最后一行数据来进行分析处理。最近因项目需要,所以我找了许多关于文件读取的相关资料尤其是针对于获取文件的最后一行或者后N行。把我最近的成果分享给大家。可以拿来直接用,也可以用来参考学习。也欢迎大家一起讨论。。。
C++直接获取文本文件的最后一行
#include <fstream>
#include <string>
#include <iostream>
#include<Windows.h>
#include<stdio.h>
#include <vector>
using namespace std;
int main()
{
ifstream File("C:\\Users\\WuHen\\Desktop\\py\\3.txt",ios::in|ios::out);
string line, last_line;
//这里采用了很笨但是很直观的方法就是逐行读取,读到最后一行输出,适合不太大的文件
while (getline(File, line))
{
last_line = line;
}
cout << last_line << endl;
File.close();
system("pause");
return 0;
}
C++输出倒数第N行的数据
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::ifstream File("C:\\Users\\WuHen\\Desktop\\py\\3.txt", std::ios::ate);
//std::ifstream fin("/var/log/test.log", std::ios::ate);
if (!File)
{
cout << "cannot open file!";
return -1;
}
// 先倒回文件末尾两个字符
File.seekg(-2, File.cur);
// 假定反向读第3行的记录
int lineCount = 3;
for (int i = 0; i < lineCount; i++)
{
// 查看前一个字符是否为回车符
while (File.peek() != File.widen('\n'))
{
File.seekg(-1, File.cur);
}
// 走到这里表示跳过一行了,所以继续向前跳直到到3行
File.seekg(-1, File.cur);
}
File.seekg(2, File.cur);
std::string line;
//如果想将倒数lineCount行都输出,再加入循环while
//while (getline(fin, line))
//{
getline(File, line);//最后一行为‘\n’,输出为空
getline(File, line);
cout << line << endl;
//}
File.clear();
File.close();
system("pause");
return 0;
}
如果想将倒数lineCount行都输出,则输出的时候再写一个循环while,如下。
C++输出倒数后N行的数据
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::ifstream File("C:\\Users\\WuHen\\Desktop\\py\\3.txt", std::ios::ate);
//std::ifstream fin("/var/log/test.log", std::ios::ate);
if (!File)
{
cout << "cannot open file!";
return -1;
}
// 先倒回文件末尾两个字符
File.seekg(-2, File.cur);
// 假定反向读第3行的记录
int lineCount = 3;
for (int i = 0; i < lineCount; i++)
{
// 查看前一个字符是否为回车符
while (File.peek() != File.widen('\n'))
{
File.seekg(-1, File.cur);
}
// 走到这里表示跳过一行了,所以继续向前跳直到到3行
File.seekg(-1, File.cur);
}
File.seekg(2, File.cur);
std::string line;
//如果想将倒数lineCount行都输出,咋加入循环while
getline(File, line);//输出为‘\n’
while (getline(File, line))
{
cout << line << endl;
}
File.clear();
File.close();
system("pause");
return 0;
}
最后我们再来加一组功能,比如我从文本1里面读取最后一行数据或者倒数第n行数据,进行字符串的截取,要在文本2里去找与之匹配的那行数据,就是接下来的。。。
C++指定字符串在文本文件里逐行匹配
在一个文件里查找指定的字符串(这里面你可以自己传参进去)所在行,并读取改行信息
若要记录行数,再加一个行计数器。。。
#include <fstream>
#include <string>
#include <iostream>
#include<Windows.h>
#include<stdio.h>
#include <vector>
using namespace std;
int main()
{
FILE *File;
char find_str[250] = "reactor.connectTCP";//匹配的字符中如果有‘\’要换成‘\\’
char file_str[521];
File = fopen("C:\\Users\\WuHen\\Desktop\\py\\3.txt", "r");
if (File == NULL)
{
cout << "cannot open file!!!" << endl;
return false;
}
while (fgets(file_str,sizeof(file_str),File))
{
if (strstr(file_str, find_str))
{
cout << file_str;
fclose(File);
}
}
system("pause");
return 0;
}