使用 c++98 从文本文件中提取数据 linux
To Extract data from text file using c++98 linux
我正在尝试从纯文本文件中提取一些行。其中包含 shell 脚本可执行文件的列表,其中包含该特定 sh 文件的一些通用键。需要从该文件中提取的所需数据应排除 .sh 文件名和 MH_TEST 键。
例如:如果我的文件 abc.lst 包含
Cable_pull1.sh
MH_TEST PAR
DUAL_DOMAIN yes
CAMARO_STORAGE YES
Flagship.sh
MH_TEST NOR
10_Flags yes
Domain_Distibute.sh
MH_TEST NOR
fast_path YES
heavy_IO YES
需要从上述文件中提取的请求数据abc.lst文件如下,
如果传递的文件名是“Cable_pull1.sh”
DUAL_DOMAIN yes
CAMARO_STORAGE YES
如果传递文件名“Flagship.sh”,预期输出如下,
10_Flags yes
下面是我试图获得结果的代码,我有点迷失了提取所需信息的地方,请帮助我提取我正在寻找的信息
#include<iostream>
#include<string>
#include <fstream>
#include <cstring>
using namespace std;
bool findWord(string Filename, string const& find)
{
cout<<"Filename:"<<Filename<<"\t"<<"find:"<<find<<endl;
ifstream iFile(Filename.c_str());
if(!iFile)
{
cerr<<"File not opened!\n";
return false;
}
char c;
string content;
while(iFile.get(c) )
{
if(c != '\n')
{
content += c;
}
else
{
content = ""; //reset string after flag ',' was found
}
if(content == find)
return true;
}
cout<<"content:"<<content<<endl;
return false;
}
int main()
{
if(!findWord("abc.lst","Cable_pull1.sh"))
cout<<"failed"<<endl;
else
cout<<"success"<<endl;
return 0;
}
我会利用 std::getline
将文件中的一行一行地读入 std::string
。然后,您可以使用 string
s 成员函数 find
来查找您要查找的内容。
例如,当您找到 Cable_pull1.sh
时,您将循环,再次使用 std::getline
,并打印后面的行,直到找到一个空行。
示例:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
bool findWord(std::string Filename, std::string const& find) {
std::cout << "Filename:" << Filename << "\tfind:" << find << '\n';
std::ifstream iFile(Filename.c_str());
if(!iFile) {
std::cerr << "File not opened!\n";
return false;
}
std::string line;
while(std::getline(iFile, line)) { // read a whole line
// and find "find" in that line
std::size_t pos = line.find(find);
// if "find" is found (pos != std::string::npos),
// check that it's a full match to the rest of the line
if(pos != std::string::npos && line.substr(pos) == find) {
// ok, we found the correct entry in the file
// loop and print each line (except the "MH_TEST" lines)
while(std::getline(iFile, line)) {
if(line.size()==0) break; // empty line, break out
if(line.find("MH_TEST") == std::string::npos) {
// print lines not matching MH_TEST
std::cout << line << '\n';
}
}
return true;
}
}
return false;
}
int main() {
if(!findWord("abc.lst", "Cable_pull1.sh"))
std::cout << "failed\n";
else
std::cout << "success\n";
return 0;
}
输出:
Filename:abc.lst find:Cable_pull1.sh
DUAL_DOMAIN yes
CAMARO_STORAGE YES
success
我正在尝试从纯文本文件中提取一些行。其中包含 shell 脚本可执行文件的列表,其中包含该特定 sh 文件的一些通用键。需要从该文件中提取的所需数据应排除 .sh 文件名和 MH_TEST 键。
例如:如果我的文件 abc.lst 包含
Cable_pull1.sh
MH_TEST PAR
DUAL_DOMAIN yes
CAMARO_STORAGE YES
Flagship.sh
MH_TEST NOR
10_Flags yes
Domain_Distibute.sh
MH_TEST NOR
fast_path YES
heavy_IO YES
需要从上述文件中提取的请求数据abc.lst文件如下, 如果传递的文件名是“Cable_pull1.sh”
DUAL_DOMAIN yes
CAMARO_STORAGE YES
如果传递文件名“Flagship.sh”,预期输出如下,
10_Flags yes
下面是我试图获得结果的代码,我有点迷失了提取所需信息的地方,请帮助我提取我正在寻找的信息
#include<iostream>
#include<string>
#include <fstream>
#include <cstring>
using namespace std;
bool findWord(string Filename, string const& find)
{
cout<<"Filename:"<<Filename<<"\t"<<"find:"<<find<<endl;
ifstream iFile(Filename.c_str());
if(!iFile)
{
cerr<<"File not opened!\n";
return false;
}
char c;
string content;
while(iFile.get(c) )
{
if(c != '\n')
{
content += c;
}
else
{
content = ""; //reset string after flag ',' was found
}
if(content == find)
return true;
}
cout<<"content:"<<content<<endl;
return false;
}
int main()
{
if(!findWord("abc.lst","Cable_pull1.sh"))
cout<<"failed"<<endl;
else
cout<<"success"<<endl;
return 0;
}
我会利用 std::getline
将文件中的一行一行地读入 std::string
。然后,您可以使用 string
s 成员函数 find
来查找您要查找的内容。
例如,当您找到 Cable_pull1.sh
时,您将循环,再次使用 std::getline
,并打印后面的行,直到找到一个空行。
示例:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
bool findWord(std::string Filename, std::string const& find) {
std::cout << "Filename:" << Filename << "\tfind:" << find << '\n';
std::ifstream iFile(Filename.c_str());
if(!iFile) {
std::cerr << "File not opened!\n";
return false;
}
std::string line;
while(std::getline(iFile, line)) { // read a whole line
// and find "find" in that line
std::size_t pos = line.find(find);
// if "find" is found (pos != std::string::npos),
// check that it's a full match to the rest of the line
if(pos != std::string::npos && line.substr(pos) == find) {
// ok, we found the correct entry in the file
// loop and print each line (except the "MH_TEST" lines)
while(std::getline(iFile, line)) {
if(line.size()==0) break; // empty line, break out
if(line.find("MH_TEST") == std::string::npos) {
// print lines not matching MH_TEST
std::cout << line << '\n';
}
}
return true;
}
}
return false;
}
int main() {
if(!findWord("abc.lst", "Cable_pull1.sh"))
std::cout << "failed\n";
else
std::cout << "success\n";
return 0;
}
输出:
Filename:abc.lst find:Cable_pull1.sh
DUAL_DOMAIN yes
CAMARO_STORAGE YES
success