我试图从一个文件中一个一个地读取输入,而不是从标准输入中给出它。
我所拥有的,目前正在运行!
for(int i = 0; i <CLASS_SIZE; i++)
{
for(int j = 0; j <10 ; j++)
{
scanf("%d", &grade);
studentsInClass[i].setGrade(j,grade);
}
}
控制台的当前输入是这样的:
91 92 85 58 87 75 89 97 79 65
88 72 81 94 90 61 72 75 68 77
75 49 87 79 65 64 62 51 44 70
我希望直接从文件中读取此输入!因此,我尝试将其作为文件流逐行读取,然后尝试将该行保存到字符串向量中,以便可以在内循环中提取每行的单个数字。
std::ifstream inputfile("input.txt");
std::string line;
std::vector<std::string> v;
for(int i = 0; i <CLASS_SIZE; i++)
{
for(int j = 0; j <10 ; j++)
{
if(inputfile.is_open()){
while( std::getline(inputfile, line) ){
std::cout << line << '\n';
std::istringstream iss(line);
iss>>v;
for(std::vector<std::string>::iterator it = v.begin(); it != v.end(); ++it) {
studentsInClass[i].setGrade(j, std::stoi(it, nullptr, 2));
}
}
inputfile.close();
}
}
}
但出现以下错误!因为我不知道正确的方法!
error: cannot bind ‘std::basic_istream<char>’ lvalue to ‘std::basic_istream<char>&&’
iss>>v;
和以下错误,因为我试图将字符串转换为整数,因为我的程序需要作为整数使用,而我又在语法上做错了。
error: no matching function for call to ‘stoi(std::vector<std::__cxx11::basic_string<char> >::iterator&, std::nullptr_t
, int)’
studentsInClass[i].setGrade(j, std::stoi(it, nullptr, 2));
任何人都可以帮助解决这个问题吗?
作为第一个近似值,我会对让您满意的代码进行最少必要的更改:
std::ifstream infile("filename");
for(int i = 0; i <CLASS_SIZE; i++)
{
for(int j = 0; j <10 ; j++)
{
// scanf("%d", &grade);
infile >> grade;
studentsInClass[i].setGrade(j,grade);
}
}
鉴于您知道每个学生的确切成绩数,您从使用getline
. 如果输入是面向行的,这将主要是有用的。例如,考虑这样的输入文件:
91 92 85 58 87 75 89 97 79 65 88
72 81 94 90 61 72 75 68 77
75 49 87 79 65 64 62 51 44 70
就目前而言,您显然仍希望将其读作 3 个学生,每个学生 10 个成绩,因此第一行 (the 88
)的最后一个成绩属于第二个学生,而不是第一个。
getline
如果您希望将此输入数据解释为第一个学生有 11 个成绩,第二个学生有 9 个成绩(以及第三个学生有 10 个成绩),那么使用然后单独解析每一行是有意义的。
这涵盖了您提出的问题,但我对代码仍然不是特别满意。就个人而言,我更愿意编写一个学生类,它知道如何从流中读取自己的数据:
class student {
std::vector<int> grades;
public:
// other stuff, of course.
friend std::istream &operator>>(std::istream &is, student &s) {
int grade;
for (int i=0; i<10; i++) {
is >> grade;
s.grades.push_back(grade);
}
return is;
}
};
然后当我们想要读取多个学生的数据时,我们会做这样的事情:
std::vector<students> the_class;
std::ifstream infile("grades.txt");
for (int i=0; i<CLASS_SIZE; i++) {
student s;
// use `operator>>` above to read all 10 grades for one student.
infile >> s;
the_class.push_back(s);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句