我正在努力了解这里发生的事情,我从我正在制作的计划中做出这一点来展示正在发生的事情。当我将它们与字符串进行比较时,从文本文件中提取的字符串不匹配。但硬编码数据会。
这个程序应该显示:
failed again
failed again
success
success
但是没有,它无法匹配a55555555的第一个实例。我发现这只发生在我从文件中提取的信息上,所以我想我在导入过程中一定做错了但我能找到什么。 实际输出:
failed again
failed again
failed again
success
文件(student.txt):
a22222222
a11111111
a55555555
代码:
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;
class Student {
public:
void display(ostream& os) const;
void setId(string);
string getId();
private:
string id_;
};
void Student::setId(string id) {
id_ = id;
}
string Student::getId() {
return id_;
}
int main () {
vector <Student> vStudent;
int count = 0;
string line;
ifstream infile("student.txt");
while (getline(infile, line)) {
vStudent.push_back(Student());
vStudent[count].setId(line);
count++;
}
vStudent.push_back(Student());
vStudent[count].setId("a55555555");
string test = "a55555555";
for (auto & element : vStudent) {
if (test == element.getId())
cout << "success" << endl;
else
cout << "failed again" << endl;
}
}
答案 0 :(得分:0)
嗯,首先,复制代码和测试数据,我得到了预期的正确结果。那可能会出现什么问题?
我怀疑这是一个行尾字符问题。例如,如果student.txt文件是在DOS / Windows环境中创建的,并且具有CR + NL样式的行尾字符,那么您所读取的行表示Unix环境将包含那些CR字符,因此匹配将失败。
它可能更简单:这些线的末端或其中一些可能有白色空间,在这样的事情出错之前很难注意到。
然后可能的修复方法是在设置id之前从每条读取行中删除所有尾随空格,例如:
#include <cctype>
/* ... */
while (getline(infile, line)) {
vStudent.push_back(Student());
while (!line.empty() && std::isspace(line.back())) line.pop_back();
vStudent[count].setId(line);
count++;
}
/* ... */
这将捕获虚假空间,以及任何错误的尾随回车。