gpt4 book ai didi

c++ - cin 丢失每行的前几个字符

转载 作者:行者123 更新时间:2023-11-28 05:05:15 25 4
gpt4 key购买 nike

我看过 other people使用 cin.ignore()getline() 报告此问题。我知道这是涉及换行符的一些问题,但我不完全确定如何使用 >> 调试它。我正在尝试实现一个成绩簿,它接收学生姓名和测试成绩并输出他们的姓名(最终是类(class)成绩)[来自 Accelerated C++ 的第 4 章]。不过,我什至无法正确输出名称。

// Student.cpp
#include "Student.h"
#include <iostream>
#include <vector>

istream& read(istream& in, Student& s) {
in >> s.name >> s.midterm;
read_hw(in, s.homework);
return in;
}

istream& read_hw(istream& in, vector<double>& hw) {
if (in) {
hw.clear();

double x;
while (in >> x)
hw.push_back(x);

in.clear();
}
return in;
}

在这里,我尝试使用我的主要功能对其进行测试:

int main() {
vector<Student> students;
Student curr_student;

while (read(cin, curr_student)) {
cout << curr_student.name;
students.push_back(curr_student);
cout << students.size() << endl;
}

cout << students.size() << endl;
for (int i = 0; i < students.size(); i++) {
cout << students[i].name << endl;
}
return 0;
}

但是,当我在命令行中输入一些内容时,第一个学生姓名之后的输出被截断了:

终端输入:

 Alice 50 50 50 50 (<enter>)
Bob 100 100 100 100 (<enter>)
Carl 50 50 50 50 (<enter>)
(<Ctrl-D>)

然后输出:

 Alice
ob
rl

最佳答案

从结果来看,等级是使用十六进制格式读取的:B , C , 和 a是有效的十六进制数字。不过,根据您的说法,这不应该发生。

无论如何请注意,格式化阅读通常会跳过所有 前导空格,包括换行符。有几种方法可以处理行尾。通常的方法是将 resd 行变成 std::string并使用字符串初始化 std::istringstream .

另一种方法是通过专门化 std::ctype<char> 来使用行结束的自定义定义。不要将换行符视为空格字符的方面。另一种方法是使用一个消耗空白但设置 std::ios_base::failbit 的操纵器。遇到换行符时。例如:

std::istream& skip(std::istream& in) {
if (std::istream::sentry kerberos{in, true}) {
std::istreambuf_iterator<char> it(in), end;
if (end != (it = std::find_if(it, end, [](unsigned char c){
return !std::isspace(c) || char(c) == '\n'; }))
&& *it == '\n') {
++it;
in.setstate(std::ios_base::failbit);
}
}
return in;
}
// ...
if (in) {
while (in >> skip >> x) {
hw.push_back(x);
}
if (!hw.empty()) {
in.clear();
}
}

虽然我认为我无法让原始代码实际重现问题,但我相当确定上述方法确实可以解决问题!

关于c++ - cin 丢失每行的前几个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993927/

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