gpt4 book ai didi

C++ 代码不读入文件

转载 作者:行者123 更新时间:2023-11-28 00:34:55 24 4
gpt4 key购买 nike

好的,这是一个项目,该项目应该从包含学生信息的文件中读取一些代码。但是,它似乎没有从文件中读取任何内容。我在 Visual Studio 中工作,当我运行它并在最后暂停时,我查看了我创建的 vector ,它说其中没有学生。 Student 是我创建的一个类。

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 .提取完成后,换行符仍留在流中。 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 采取的行动的任何影响.


最后,保存学生指针的 vector 应该保存实际对象本身。这避免了使用动态内存分配的需要。因此 vector 的类型应该是 std::vector<Student> .这就是构建 vector 中的元素的方式:

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);
}
}
}

关于C++ 代码不读入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21343575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com