我正在尝试使用.dat读取ifstream.文件。当我阅读问题时,我的问题是需要设置2个定界符。
第一个是','第二个是'\n'

我的文件格式是这样的,
item1,item2,item3
item4,item5,item6

我的问题是用现在的方式添加“ \ n”。
我目前在这样的while循环中添加','作为分隔符

 while (std::getline(infile, line, ','))


但是后来得到'\ n'真让我失望。所以在while循环中,我尝试了类似的方法,

    std::getline(infile, inp.item.group, ',' );
    std::getline(infile, inp.item.total_pay, ',' );
    std::getline(infile, inp.item.quantity, '\n' );


但是很明显,我不理解如何访问我的每一项,并给它们各自定界符。

我是否应该像使用新行作为分隔符那样无法读取整行,然后像在while循环中尝试的那样将所有内容拆分开?

我的相关代码如下,

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>

struct Input
{
    friend std::istream& operator >>(std::istream& inp, Input& item);
    friend std::ostream& operator <<(std::ostream& outp, Input const& item);

    std::string group;
    std::string total_pay;
    float quantity;

    // default constructor. sets up zero-elements
    Input() : group(), total_pay(), quantity()
    {
    }

    Input(std::string groupIn, std::string total_payIn, float quantityIn) :
    group(std::move(groupIn)),
    total_pay(total_payIn),
    quantity(quantityIn)
    {
    }

    // Accessors
    std::string const& getGroup() const { return group; }
    std::string getTotalPay() const { return total_pay; }
    float getQuantity() const { return quantity; }
};

// global free function for extracting an Input item from an input stream
std::istream& operator >>(std::istream& inp, Input& item)
{
    return (inp >> item.group >> item.total_pay >> item.quantity);
}

// global operator for inserting to a stream
std::ostream& operator <<(std::ostream& outp, Input const& item)
{
    outp
    << item.getGroup() << ", "
    << item.getTotalPay() << ", "
    << item.getQuantity();
    return outp;
}

struct ctype : std::ctype<char>
{
    static mask* make_table()
    {
        static std::vector<mask> table(classic_table(),
                                       classic_table() + table_size);
        table[','] |= space;
        return &table[0];
    }

    ctype() : std::ctype<char>(make_table()) { }
};

int main() {

    std::ifstream infile("employee.dat");

    // one line per item enforced.
    std::vector<Input> data;
    std::string line;

    while (std::getline(infile, line))
    {

        std::istringstream iss(line);
        Input inp;
        infile.imbue(std::locale(iss.getloc(), new ctype));
        std::vector<Input> data((std::istream_iterator<Input>(std::cin)), {});

        if (iss >> inp) // calls our extraction operator >>
            data.push_back(inp);
        else
            std::cerr << "Invalid input line: " << line << '\n';
    }

    // dump all of them to stdout. calls our insertion operator <<
    std::copy(data.begin(), data.end(),
              std::ostream_iterator<Input>(std::cout,"\n"));

    return 0;
}

最佳答案

您可以使用自定义的std::ctype构面设置定界符。然后,格式化的提取器将处理其余的工作:

struct ctype : std::ctype<char>
{
    static mask* make_table()
    {
        static std::vector<mask> table(classic_table(),
                                       classic_table() + table_size);
        table[','] |= space;
        return &table[0];
    }

    ctype() : std::ctype<char>(make_table()) { }
};

// ...
int main()
{
    // ...
    infile.imbue(std::locale(iss.getloc(), new ctype));
    std::vector<Input> data((std::istream_iterator<Input>(std::cin)), {});
}

关于c++ - 在while循环中为fstream c++使用多个定界符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26513357/

10-13 07:39