当前位置: 首页 > 知识库问答 >
问题:

读取并解析一个文件,将每一段解析后的字符串赋给它自己的变量

曾珂
2023-03-14
 89   int Student::loadStudents() {
 90   Student newStudent;
 91   string comma;
 92   string line;
 93   ifstream myfile("student.dat");
 94   string name,email="";
 95   string status="";
 96   int id;
 97   if (myfile.is_open()){
 98     while ( getline (myfile,line) ) {
 99         //parse line
100         string myText(line);
101         istringstream iss(myText);
102         if(!(iss>>id)) id=0;
103
104         std::ignore(1,',');
105         std::getline(iss,name,',');
106         std::getline(iss,status,',');
107         std::getline(iss,email,',');
108         cout<<name<<endl;
109         Student newStudent(id,name,status,email);
110         Student::studentList.insert(std::pair<int,Student>(id,newStudent));

以上是我定义的方法。执行 cout 时,输出为:

无名氏

马特·史密斯

在我添加第二个getline(iss,name,',')之前,cout什么也没做。

有人能解释为什么它可以重复使用这行代码,为什么相同的代码不能用于状态和电子邮件吗?

文件中的示例行:

1、约翰·多伊,大一新生,jd@email.com

编辑:

我在第一个 getline(iss,name,',') 之前使用了 std::ignore(1,','),并收到错误 'ignore' 在此命名空间 'std' 中未声明。

共有1个答案

沃学
2023-03-14

有人能解释为什么它可以重复使用这行代码,为什么相同的代码不能用于状态和电子邮件吗?

因为在< code>isa上的第一个操作是< code>iss

假设您的输入文件的格式是< code>id,name,status,email。第一个操作读到但不包括第一个逗号。第一个逗号仍然在输入流中。这意味着您的第一个< code>std::getline(iss,name,',')将读取第一个逗号和第一个逗号之前剩余的所有内容。第一个逗号之前的所有内容,那是一个空字符串。

最好不要混合解析概念。沿着逗号拆分该行,然后解析每个拆分的元素


编辑
处理此问题的另一种方法:调用 std::ignore,而不是第一次调用 std::getline。要读取的下一个字符应该是逗号,因此请忽略它。如果您可以假设输入文件格式正确,这是可以的。如果您必须处理人类创建的输入文件的变幻莫测,这是不行的。

另一个问题:假设某人的名字是“John Doe, PhD”或电子邮件地址是“John Doe, PhD”?

< br >编辑2
只是为了澄清一下,假设该行包含“1234,John Doe,新生,jdoe@college_name.edu”。

iss之前的输入指针

iss 之后的输入指针

第一次调用< code>std::getline后的输入指针(第二次调用< code>std::getline前):< br> 1234,John Doe,新生,jdoe @ college _ name . edu < br > _____^
第二个< code>std::getline(iss,name,',')读到第二个逗号。它将< code>name设置为“John Doe”空字符串,并将输入指针移至第二个逗号之后。

第二次调用 std::getline 后输入指针(在第三次调用 std::getline 之前):
1234,John Doe,新生,jdoe@college_name.edu
____________^

 类似资料:
  • 存在问题 来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它。怎么办?jsonu能够帮你轻松解决这些问题 解决方法 使用静态Jsoup.parse(String html) 方法或Jsoup.parse(String html, String baseUri)示例代码: String html = "<html><head><tit

  • 问题内容: 我要解析的字符串: 周日2013年11月10日10:00:00 我的代码: 编译器错误输出: java.text.ParseException:无法解析的日期:java.text.DateFormat.parse(Unknown Source)的“ Sun Nov 10 10:00:00 CET 2013”​​ … 问题答案: 可能您缺少正确的语言环境。在您的示例中尝试以下操作:

  • 我在下面有一个java程序: 现在,我想将两个字符串值“加纳”或“加纳”分配给“National”变量,这样当用户输入“加纳”或“加纳”时,当程序将“nation”值检查为“National”值,然后执行“if”块中的语句时,条件变为真。 但是有了我上面的代码,程序只有在用户输入“加纳”时才会执行“如果”语句;程序在用户输入“加纳”时才会执行“其他”语句。 请帮帮我。 谢谢你。

  • 问题内容: 这是我第一次使用YAML文件,因此我首先想到的是找到任何可以帮助我解析文件的库。 我发现了两个库YamlBean和SnakeYAML。我不确定我要使用哪一个。 这是我要解析的文件的示例: 该文件将动态更改,因此我不知道该文件将包含多少个用户或组。 我想从中获取的信息是用户名和类似的组: 并且仅从组中选择组名,如下所示: 有人可以让我从这里开始吗?最佳的库是什么?YamlBean或Sna

  • 我想做一个java程序,将读取一个文本文件,并存储每一个单一的字符出现。因此,它将解释标点符号,字母,数字,大写,小写等。给定一个文本文件,如: 打印值将如下所示: R:1 r:3

  • 问题内容: 例如,给定字符串“ 2009/11/12”,我想获取正则表达式(“ \ d {2} / d {2} / d {4}”),因此可以匹配“ 2001 /也是01/02”。 有什么可以做的吗?相似的东西?有任何想法吗? 问题答案: 有text2re,这是一个基于Web的免费“正则表达式示例”生成器。 我认为这在源代码中不可用。我敢说没有自动的正则表达式生成器,无需用户干预即可正确运行,因为这