C 代码未在文件中读取

C++ Code not reading in file

本文关键字:读取 文件 代码      更新时间:2023-10-16

好吧,这是针对一个项目,该项目应该从文件中读取一些代码,其中包含有关学生的信息。但是,它似乎并没有从文件中读取任何内容。我正在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的使用的方向,也会有所帮助。谢谢!

此行:

while (input >> id_number)

将整数从输入流提取到id_number中。提取完成后,Newline字符仍留在流中。std::getline()被编程为在发现Newline字符时终止提取(除其他规格)。

要绕过这种情况,您需要使用std::ws操纵器丢弃 newline。 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);
        }
    }
}