如何在C++中使用ifstream从文本文件读取到逗号
How read from text file until comma using ifstream in 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
我正在尝试使用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看起来更干净,也不那么令人困惑。
相关文章:
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何使用 c++ 实现并发文件/文本编辑?
- 我需要转换一些代码,以便它适用于输入和输出文件文本
- 通过套接字发送二进制文件.文本文件有效,其他文件无效
- 将大型数据文件拆分为多个小文件(文本格式)
- 如何读取输入文件(文本文件)并将输入验证为有效整数
- 从文本文件/文本流中读取Q字符串错误
- 从文本文件(文本解析器)C++中读取行和列的逻辑
- 如何将*.css文件(文本文件)的内容与附加信息存储在新文件中?
- 关于内存映射文件和使用大文件文本编辑器
- 如何在读取文件文本时跳过"n"
- 使用libzip从.zip获取文件(文本除外)