我正在做一个作业,在其中创建一个名为Formula.txt的文件,其中包含以下内容:
100 + 50-25 + 0 + 123-1
现在我必须使用输入重定向,以便文件读取整数并为我提供上述整数的总和。
我尝试过包括字符串以及将整数类型更改为char以照顾+和-号。我知道cin接受输入并跳过空格,但是我的总和不是所需的总和。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int sum = 0; //sets sum to 0
char input=0;// sets input to 0
while(cin>>input) // reads inputs
{
sum+=input; // adds inputs
}
cout << sum << endl; // adds input
}
我应该得到答案247 相反,我有835
答案 0 :(得分:3)
首先,对>>
使用char
来丢弃空格。
字符100+50-25+0+123-1
的ascii值为:
49, 48, 48, 43, 53, 48, 45, 50, 53, 43, 48, 43, 49, 50, 51, 45, 49
他们的总和是815
。那解释了您的输出。
您应该阅读数字和运算符,而不要阅读单个字符。
要读取文件,您可以使用std::ifstream
,如下所示:
#include <fstream>
#include <string>
int main()
{
std::ifstream ifs{"file name here"}; // NOTE: put your own file name here!!
int sum;
ifs >> sum;
for (char c; ifs >> c;)
{
int num;
ifs >> num;
if (c == '+')
sum += num;
if (c == '-')
sum -= num;
}
std::cout << sum << "\n";
}
或者您也可以使用系统提供的管道语法,这可能就是您所说的“重定向”。
答案 1 :(得分:0)
尽管另一个回答了您的问题,但这是使用getline
的方法之一。假定文件只有一行。
#include <fstream>
#include <sstream>
#include <string>
enum class Operation {
ADD,
SUBTRACT
};
int main() {
std::ifstream fin {"<file to be opened>"};
std::string str;
std::getline(fin, str);
std::istringstream sstr(str);
std::string op;
int ans = 0;
Operation lastOperation = Operation::ADD;
while (sstr >> op) {
if (op == "+") {
lastOperation = Operation::ADD;
} else if (op == "-") {
lastOperation = Operation::SUBTRACT;
} else {
int num = std::stoi(op);
if (lastOperation == Operation::ADD) {
ans += num;
} else if (lastOperation == Operation::SUBTRACT) {
ans -= num;
}
}
}
cout << ans << "\n";
}