C ++代码无法读取文件

时间:2014-01-24 22:22:43

标签: c++

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

1 个答案:

答案 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::cininput采取的行动不会影响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}}