如何一次从文件中读取一个输入,类似于在 C++ 中使用 cin/scanf 从控制台读取输入?

阿努

我试图从一个文件中一个一个地读取输入,而不是从标准输入中给出它。

我所拥有的,目前正在运行!

   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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我需要从控制台并使用InputStream的输出以不同的顺序读取输入

如何使用Java中的Scanner类从控制台读取输入?

如何使用Go以非阻塞方式从控制台读取输入?

如何从控制台的标准输入中读取?

从Ruby中的控制台读取输入?

使用Objective C读取发布到设备控制台的日志消息

快速读取控制台输入

尝试使用纯Win64 API从x64汇编器读取控制台输入(无C运行时)

如何在F#中从控制台读取输入

如何从C#中的ROM文件一次读取一个字节

如何读取控制台输入,直到空格或在C#中输入

在控制台输入中使用PHPUnit测试php文件?

F#从控制台读取输入

使用console.readline使进程保持活动状态时,如何读取控制台输入?

C ++文件输入/输出控制台输出

读取控制台输出以在C中执行ping操作

使用fifo的C程序无法正常工作,Unix控制台等待输入

读取在C ++中使用控制台应用程序打开的文件

在C#中从控制台读取整数

使用scanf()停止控制台输入

执行控制台程序,写入标准输入并使用管道读取结果

在C中使用fscanf读取一个十六进制值序列(一次读取2个)

创建一个控制台应用程序,以打开TCP / IP连接并打印输入的字符串-使用C ++,C#或Java

C ++控制台读取不确定数量的输入并将其放入数组中?

C#控制台输入

C#:使用输入控制台优化错误预防

在 Mocha 中使用 Sinon 读取断言控制台消息

从 C++ 中的控制台输出读取

尝试使用 node.js 中的 readline 从控制台读取输入,但应用程序不等待输入