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

How read from text file until comma using ifstream in C++?

本文关键字:文件 文本 读取 ifstream C++      更新时间:2023-10-16

我有以下数据库:

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

我正在尝试使用ifstream使C++根据文本文件输出成员的第一个中间名和姓氏。一个人怎么能做到这一点?这是我的代码

int main() {
    double socialSN = 0;
    string memberFName = "";
    string memberMName = "";
    string memberLName = "";
    double memberID = 0;
    char div = ',';
    ifstream infile;
    infile.open ("salary_database2.txt");
    if(!infile) {cout << "Error: File not found or corrupt. "<< endl; return 1;}
    while(infile >> socialSN >> memberLName >> div >> memberMName >> div >> memberFName >> memberID) {
        cout << setprecision(0) << fixed;
        cout << memberFName << "     " << memberMName << "     " << memberLName << endl;
    }
    return 0;
}

编译器没有显示任何错误。这个节目就是什么都没显示。

提取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;
}

根据这个答案:

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

istream将"空白"视为分隔符。它使用区域设置告诉它哪些字符是空白。区域设置反过来又包括对字符类型进行分类的ctype方面。这样一个方面看起来像这样的东西:

#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看起来更干净,也不那么令人困惑。