C++ 如何从由|

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

我正在寻找一种从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;
}
那么,如果列之间用|?

分隔,如何提取呢?请使用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 ;