如何从文本文件中读取,直到逗号在C ++中使用ifstream?

时间:2016-05-11 05:46:20

标签: c++ text-files ifstream

我有以下数据库:

Dependencies

我正在尝试使用compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' 根据文本文件使C ++输出成员的第一个中间名和姓氏。一个人如何才能完成这个?这是我的代码

101884622 Johnson,Jack,Michael   239483
441314978 Meyers,Sally,Elaine    019383
684736222 Smallwood,Jason,Joseph 293812
387240551 Ward,Richard,Charles   472041
273639944 Vapson,Michelle,Regina 112039
654230472 Wilson,Donald,Anthony  528763
736459533 Utzig,Jacob,William    614524
687130851 Brown,Betty,Mary       079813

编译器没有显示错误。该程序没有显示任何内容。

2 个答案:

答案 0 :(得分:2)

提取operator>>使用空格作为读取的分隔符,因此它使用您当前的实现将整个第一个,中间名和最后一个名称读入memberLName。您需要做的是使用std::getline分隔使用逗号读取名称,可能类似于:

while(infile >> socialSN && getline(infile, memberLName,',') &&
      getline(infile, memberMName,',') && 
      infile >> memberFName && infile >> memberID) 
{
        cout << setprecision(0) << fixed;
        cout << memberFName << "     " << memberMName << "     " << memberLName << endl;
}

答案 1 :(得分:1)

根据这个答案:

https://stackoverflow.com/a/10376445/210971

  

istream对待&#34;白色空间&#34;作为分隔符。它使用语言环境   告诉它什么字符是白色空间。反过来,一个语言环境包括一个   ctype facet,用于对字符类型进行分类。这样的方面可以看起来   像这样的东西:

#include <locale>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <sstream>

class my_ctype : public
std::ctype<char>
{
    mask my_table[table_size];
public:
    my_ctype(size_t refs = 0)  
        : std::ctype<char>(&my_table[0], false, refs)
    {
        std::copy_n(classic_table(), table_size, my_table);
        my_table[','] = (mask)space;
    }
};

现在您的程序将如下所示:

int main() {
    double socialSN = 0;
    string memberFName = "";
    string memberMName = "";
    string memberLName = "";
    double memberID = 0;

    ifstream infile;
    infile.open ("salary_database2.txt");
    if(!infile) {
        cout << "Error: File not found or corrupt. "<< endl; return 1;
    }
    std::locale x(std::locale::classic(), new my_ctype);
    infile.imbue(x);

    while(infile >> socialSN >> memberLName >> memberMName >>  memberFName >> memberID) {
        cout << setprecision(0) << fixed;
        cout << memberFName << "     " << memberMName << "     " << memberLName << endl;
    }
    return 0; 
}

但使用getline看起来更干净,更少混淆。