我正在寻找一种从txt文件中提取数据的方法,该数据按行分开,每列数据由|
分隔这是一个例子
12|john bravo|123 kings street
15|marry jane|321 kings street
以前我是通过使用像这样的空格分开来做到的。
12 john kingstreet
15 marry kingstreet
但是当我在姓名中添加姓氏/添加带空格的地址时会出现问题,例如:john bravo 所以我决定使用|
分离列数据这是我提取数据的方式
struct PERSON{
int id;
string name;
string address;
};
//extract
int main(){
PERSON data[2];
ifstream uFile("people.txt");
int i = 0;
while(uFile >> data[i].id >> data[i].name >> data[i].address){
i++;
}
return 0;
}
那么如果用|分隔列,我该如何提取? ??
答案 0 :(得分:4)
使用getline()两次: 首先,让每一行使用默认的分隔符(新行);第二,对于第一步中的每个段,使用“|”作为分隔符。 “stringstream”类可用于传输数据。
@edward下面的代码是从你的代码修改的,我认为@ P0W58的答案更好。
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
const int length = 2;
struct PERSON
{
int id;
string name;
string address;
};
//extract
int main()
{
PERSON data[length];
ifstream fin("people.txt");
int i = 0;
while(true)
{
string segment;
if (!getline(fin, segment))
break;
stringstream transporter;
transporter << segment;
string idString;
getline(transporter, idString, '|');
getline(transporter, data[i].name, '|');
getline(transporter, data[i].address, '|');
stringstream idStream;
idStream << idString;
idStream >> data[i].id;
i++;
}
for (i=0; i<length; i++)
cout << data[i].id << '+' << data[i].name << '+'\
<< data[i].address << endl;
return 0;
}
答案 1 :(得分:2)
要阅读struct
,我会重载<<
,然后解析其中一个答案中提到的文字。
这样的事情:
#include<sstream>
//...
struct PERSON{
int id;
std::string name;
std::string address;
friend std::istream& operator >>(std::istream& is, PERSON& p)
{
std::string s;
std::getline(is, s); //Read Line, use '\r' if your file is saved on linux
std::stringstream ss(s);
std::getline(ss, s, '|'); //id
p.id = std::atoi(s.c_str());
std::getline(ss, p.name, '|'); // name
std::getline(ss, p.address, '|'); //address
return is ;
}
};
然后你可能会这样做,
std::ifstream fin("input.txt");
PERSON p1;
while (fin >> p1)
//std::cout << p1.id << p1.name << std::endl ;
您也可以重载<<
答案 2 :(得分:0)
使用boost :: tokenizer或首先找到like:
// code example
string s = "12|john bravo|123 kings street";
string delimiters = "|";
size_t current;
size_t next = -1;
do
{
current = next + 1;
next = s.find_first_of( delimiters, current );
cout << s.substr( current, next - current ) << endl;
}
while (next != string::npos);