我一直在和我的教授来回交流,讨论为什么在c ++中不需要或不需要素读。
#include <iostream>
#include <fstream>
int addFunct(int& total, int& rNum);
int subFunct(int& total, int& rNum);
int main() {
char op1;
int rNum = 0;
int total = 0;
std::ifstream inFile;
inFile.open("C:\\Users\\Administrator\\Desktop\\c++ files\\input.txt");
if (inFile.fail()) {
std::cout << "no read";
}
do {
inFile >> op1 >> rNum;
if (op1 == '+') {
addFunct(total, rNum);
}
else if (op1 == '-') {
subFunct(total, rNum);
}
}
while (!inFile.eof()); //super while loop
inFile.close();
std::cout << "El total es: " << total;
return 0;
}
int addFunct(int& total, int& rNum) {
total = total + rNum;
return total;
}
int subFunct(int& total, int& rNum) {
total = total - rNum;
return total;
}
如果我在我的DO语句上方放置素数读取(例如inFile >> op1 >> rNum;),那么将不会读取文件中的最后一个值。但是,我的教授认为,启动阅读很重要且必要。我想知道为什么会这样,以及如何解决对最近读入的号码不执行操作的问题。
答案 0 :(得分:3)
为什么我需要用c ++进行基本阅读?
你没有。
但是,我的教授认为,引发阅读是重要和必要的。
您是否要求他们提供解释?还是他们只是这么说而拒绝解释?
详细说明-您和您的教授的方法都是错误的。两者都是因为它们使用std::fstream::eof
作为循环条件,即almost always wrong。
您应该做的就是将读数移至循环条件,如下所示:
while (inFile >> op1 >> rNum) {
if (op1 == '+') {
addFunct(total, rNum);
}
else if (op1 == '-') {
subFunct(total, rNum);
}
}
这样,您将不会丢失文件中的任何数据。由于文件结尾或无法将文件内容解析为char
后跟int
的原因,一旦读取失败,您也将不会正确进入循环。
之所以可行,是因为如果>>
读取失败,它将设置关联流的某些失败位。然后,>>
运算符返回隐式可转换为inFile
的流本身(在这种情况下为bool
)。如果未设置故障位,则求值为true
,否则为false
。
答案 1 :(得分:0)
Priming read 只是在第一次测试条件时加载 while 循环。我认为教授认为这很重要,因为这是为结构化编程和流程图设置 while 循环的标准方法。