Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么输入流从第二行输入中剪切一些字符 我编写了一个简单的C++程序,从输入中输入一个学生姓氏,然后是期中、期末和各种家庭作业成绩(如:Carlo 2 5,7,8)。 问题是,从第二行输入中,它删掉了一些学生的姓氏_C++ - Fatal编程技术网

为什么输入流从第二行输入中剪切一些字符 我编写了一个简单的C++程序,从输入中输入一个学生姓氏,然后是期中、期末和各种家庭作业成绩(如:Carlo 2 5,7,8)。 问题是,从第二行输入中,它删掉了一些学生的姓氏

为什么输入流从第二行输入中剪切一些字符 我编写了一个简单的C++程序,从输入中输入一个学生姓氏,然后是期中、期末和各种家庭作业成绩(如:Carlo 2 5,7,8)。 问题是,从第二行输入中,它删掉了一些学生的姓氏,c++,C++,一个例子 Enter the surname of each student followed by the midterm, final, and homework grades. Carlo 2 3 4 5 Bonandrini 2 3 4 5 Carlo 3.4 onandrini 3.4 正如你所看到的,第二个名字前面缺了一个b。 我尝试了不同的名字和名字的长度,但没有任何变化,它仍然削减了名字。 据我所知,问题来自输入本身 #include<vector> #i

一个例子

Enter the surname of each student followed by the midterm, final, and homework grades.
Carlo 2 3 4 5
Bonandrini 2 3 4 5

Carlo     3.4
onandrini 3.4
正如你所看到的,第二个名字前面缺了一个b。 我尝试了不同的名字和名字的长度,但没有任何变化,它仍然削减了名字。 据我所知,问题来自输入本身

#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
#include<ios>
#include<iomanip>
#include<stdexcept>

template<typename T>
T median(std::vector<T> vec) // Not passed by name because we sort the vector
{
    typedef typename std::vector<T>::size_type vec_sz;
    vec_sz size = vec.size();

    if(!size)
        throw std::domain_error("Median of an empty vector");

    std::sort(vec.begin(), vec.end());

    vec_sz pos = size / 2;

    return size % 2 == 0 ? (vec[pos] + vec[pos-1]) / 2 : vec[pos];
}

template<typename T>
std::istream& operator>>(std::istream& stream, std::vector<T>& vec)
{
    if(stream) // If stream is actually open
    {
        vec.clear(); // In case the vector wasn't empty

        T x; 
        while(stream >> x)
            vec.push_back(x);


        stream.clear();
    }
    return stream;
}

struct StudentInfo
{
    std::string name;
    double midterm, final;
    std::vector<double> homework;
};

double grade(const StudentInfo& student)
{
    return 0.2 * student.midterm + 0.4 * student.final + 0.4 * median<double>(student.homework);
}

std::istream& operator>>(std::istream& stream, StudentInfo& student)
{
    stream >> student.name >> student.midterm >> student.final;

    stream >> student.homework;

    return stream;
}

int main()
{
    std::cout << "Enter the surname of each student followed by the midterm, final, and homework grades" << std::endl;
    std::vector<StudentInfo> students;

    std::string::size_type maxlen = 0;
    StudentInfo student;
    while(std::cin >> student) 
    {
       maxlen = std::max(maxlen, student.name.size());
        students.push_back(student);
    }

    std::sort(students.begin(), students.end(), 
    [](const StudentInfo& student1, const StudentInfo& student2){ return student1.name < student2.name; });

    for(StudentInfo student : students)
    {
        // + 1 to put a space between the name and the grade
        std::cout << student.name << std::string(maxlen + 1 - student.name.size(), ' ');

        try{
            double points = grade(student);
            std::streamsize prec = std::cout.precision();
            std::cout << std::setprecision(3) << points << std::setprecision(prec);
        }
        catch(std::domain_error e){
            std::cout << e.what();
        }

        std::cout << std::endl;
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
模板
T median(std::vector vec)//未按名称传递,因为我们对向量进行了排序
{
typedef typename std::vector::size_type vec_sz;
vec_sz size=vec.size();
如果(!大小)
抛出std::域_错误(“空向量的中值”);
排序(vec.begin(),vec.end());
vec_sz pos=尺寸/2;
返回大小%2==0?(vec[pos]+vec[pos-1])/2:vec[pos];
}
模板
std::istream&operator>>(std::istream&stream,std::vector&vec)
{
if(stream)//如果流实际上是打开的
{
vec.clear();//如果向量不是空的
tx;
while(流>>x)
向量推回(x);
stream.clear();
}
回流;
}
结构学生信息
{
std::字符串名;
双倍期中、期末考试;
向量作业;
};
双年级(const StudentInfo和student)
{
返回0.2*学生期中+0.4*学生期末+0.4*中位数(学生作业);
}
std::istream&operator>>(std::istream&stream,学生信息&学生)
{
stream>>student.name>>student.midtime>>student.final;
流>>学生作业;
回流;
}
int main()
{
std::cout(学生)
{
maxlen=std::max(maxlen,student.name.size());
学生。推回(学生);
}
std::sort(students.begin(),students.end(),
[](const StudentInfo&student1,const StudentInfo&student2){return student1.name我假设你的名字是指“最后一个”或“最后一个,第一个”之类的

如果是这种情况,问题在于您使用std::stream>>std::string。此输入在空格上取消。空格后的任何内容都被视为新字符串,除非您告诉它。如果期中考试是字符串而不是双精度的,空格后的部分将显示在那里。相反,它只是忽略它,因为它不知道如何将其转换为双精度一串


您需要的是std::stream.getline(),这可能会起到作用。

您能缩小错误的来源吗?您能提供一个此错误失败的测试用例吗?一个例子会很理想,因为它有点代码。您的名字是什么意思?像First Last?不清楚“第二行输入”上到底是什么。输入的第一行是什么?每一行实际上是什么样子的?哪些字符被精确地“截断”了?在您的示例中,
Carlos 2 5 7 8
在末尾缺少一个
<0
值来告诉
操作员>
停止循环。另外,让
操作员>
调用
流。clear()
读取输入错误后,不要这样做。这会阻止调用者正确检测流错误。这似乎对我有用。不过,我会使用getline,并从stringstream解析它。奇怪的是,您有一个自定义运算符>>但没有运算符按名称,我只指姓氏,所以这不是问题。好的。好吧,在t案例,你能给出一个测试案例、预期结果和实际结果吗?我已经把它放在了课程的开头question@CarloBonandrini我无法重现这个问题。唯一不同的是我控制循环的方式是:for(unsigned int I=0;I您使用什么来结束输入?我在macos中使用的行结束命令是ctrl+d。