C++ 如何从由|
我正在寻找一种从txt文件中提取数据的方法,该文件中的数据按行分隔,每列数据按行分隔| 这里有一个例子C++ 如何从由|,c++,C++,我正在寻找一种从txt文件中提取数据的方法,该文件中的数据按行分隔,每列数据按行分隔| 这里有一个例子 12|john bravo|123 kings street 15|marry jane|321 kings street 以前,我是通过使用这样的空格来分隔的 12 john kingstreet 15 marry kingstreet 但是,当我在姓名中添加姓氏/添加带有空格的地址时,就会出现问题,例如:john bravo 所以我决定使用| 这就是我提取数据的方式 struct PE
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;
}
那么,如果列之间用|?分隔,如何提取呢?请使用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;
}
#包括
#包括
#包括
使用名称空间std;
常数int长度=2;
结构人
{
int-id;
字符串名;
字符串地址;
};
//提取
int main()
{
个人数据[长度];
ifstream fin(“people.txt”);
int i=0;
while(true)
{
字符串段;
如果(!getline(fin,段))
打破
串流运输机;
运输机数据[i].id;
i++;
}
对于(i=0;i使用boost::tokenizer或find first of 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);
//代码示例
字符串s=“12 |约翰·布拉沃|国王街123号”;
字符串分隔符=“|”;
电流大小;
下一个大小=-1;
做
{
电流=下一个+1;
next=s.find_first_of(分隔符,当前);
cout要读入结构
,我需要重载
(std::istream&is,PERSON&p)
{
std::字符串s;
std::getline(is,s);//读取行,如果文件保存在linux上,请使用“\r”
标准::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,“|”);//地址
回报是;
}
};
然后你就可以
std::ifstream fin("input.txt");
PERSON p1;
while (fin >> p1)
//std::cout << p1.id << p1.name << std::endl ;
std::ifstream-fin(“input.txt”);
人p1;
而(fin>>p1)
//std::我是否也在用|保存?通过程序,txt文件帮助我保存数据。与问题中提出的完全不将换行符视为特殊的方法相比,这是正确的答案。如果输入包含“错误的字段数”。istream&getline(istream&is、string&str、char-delim);如果使用默认分隔符,请忽略第三个参数。这可能会有帮助:我仍然没有完全了解getline的全貌,因为它与我通常使用的方法不同。你能给我提供一个代码示例吗?谢谢你的帮助。next!=string::npos
的意思是什么?这意味着find_first_of返回的位置不等于al to no match当我向struct PERSON添加新元素时,例如,我添加了float cash
,对于getline,我添加了std::getline(ss,p.cash,“|”);
,我得到一个错误:没有重载函数std:的实例:getline@Ah,对于float
使用,如图所示std::stoi
对于int
。也要首先查看错误消息并研究引用/文档。仅对std::basic_string
工作。如果我将float添加为最后一个元素,我应该在gett之后添加它输入地址:std::getline(ss,s,“|”);p.cash=stof(s.c_str());
std::ifstream fin("input.txt");
PERSON p1;
while (fin >> p1)
//std::cout << p1.id << p1.name << std::endl ;