好吧,这是一个项目,它应该从一个包含学生信息的文件中读取一些代码。但是,它似乎没有从文件中读取任何内容。我在Visual Studio工作,当我运行它并在最后停顿时,我会看到我创建的向量,并且它说没有学生。学生是我创建的课程。
ifstream input;
string student_file;
cin >> student_file;
input.open(student_file);
double id_number = 0;
while (input >> id_number)
{
string name = "";
string address = "";
string phone_number = "";
cin.sync();
getline(input, name);
cin.sync();
getline(input, address);
cin.sync();
getline(input, phone_number);
Student * s = new Student(id_number, name, address, phone_number);
students.push_back(s);
}
应该使用构造函数和所有内容正确设置学生类,所以我假设这个代码给了我麻烦。关于问题是循环还是我使用getlines的一些方向也会有所帮助。谢谢!
答案 0 :(得分:3)
这一行:
while (input >> id_number)
将输入流中的整数提取到id_number
。提取完成后,换行符仍留在流中。 std::getline()
被编程为在发现换行符时(以及其他规范)终止提取。
要避免这种情况,您需要使用std::ws
操纵器丢弃换行符。 std::ws
仅从流中丢弃前导空格。换行符被视为空格。还建议您通过在if
语句中包含提取来检查输入是否成功:
if (std::getline(input >> std::ws, name) && std::getline(input >> std::ws, address) && std::getline(input >> std::ws, phone_number))
请注意,我还删除了两次调用之间的std::cin.sync()
。在此上下文中不需要同步输入缓冲器,因为不执行流插入,因此不需要考虑对外部序列的改变。此外,同步std::cin
的输入缓冲区的想法是非荒谬的,因为std::cin
对input
采取的行动不会影响std::vector<Student>
。
最后,持有学生指针的向量应该自己保存实际对象。这避免了使用动态内存分配的需要。因此,向量的类型应为students.emplace_back(id_number, name, address, phone_number);
。这就是你在向量中构造元素的方法:
#include <iostream> #include <fstream> #include <string> int main() { std::ifstream input; std::string student_file; std::cin >> student_file; input.open(student_file); double id_number = 0; std::vector<Student> students; while (input >> id_number) { string name; string address; string phone_number; if (std::getline(input >> std::ws, name) && std::getline(input >> std::ws, address) && std::getline(input >> std::ws, phone_number)) { students.emplace_back(id_number, name, address, phone_number); } } }
以下是完整代码:
{{1}}