如何在 C++ 中使用输入重定向添加整数

Posted

技术标签:

【中文标题】如何在 C++ 中使用输入重定向添加整数【英文标题】:How to add integers using input redirection in c++ 【发布时间】:2019-02-09 00:06:49 【问题描述】:

我正在做一个任务,我创建了一个名为 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

【问题讨论】:

“输入重定向”具体是什么意思?你的意思是使用操作系统的“管道”功能还是别的什么? 看起来像你 1) 读取字符而不是数字 2) 总是在看起来涉及减法时添加。您需要自己编写一个解析器来将操作数与运算符分开,并对操作数执行适当的操作。 您的代码将所有输入视为相同。很明显,一个工作程序必须以不同的方式对待+- 和数字。你必须做额外的工作,这就是练习的重点。 C++ 不会为你做这件事。对于初学者来说,这似乎是一项非常困难的任务。 @Dai 将数字写入单独的文件而不是程序中。这些数字充当我的输入,而不是在程序运行时直接输入数字 @john 我同意,我该怎么做,我还没学会解析 【参考方案1】:

首先,您将&gt;&gt; 用于chars,它会丢弃空格。

字符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";

或者您也可以使用系统提供的管道语法,这可能就是您所说的“重定向”。

【讨论】:

有没有办法使用 getline 函数来做到这一点?或将 ascii 重新转换为整数 @IntisarRatul 我看不到 getline 在这里有什么帮助。要将 ascii 重新转换为整数,请使用 char(55),例如,获取 ascii 55 的字符。 @IntisarRatul 什么不起作用?您是否将“此处的文件名”替换为您自己的文件? @IntisarRatul 确保将您的文件名放在与可执行文件相同的目录中。 @IntisarRatul 对不起 Intisar,我犯了一个愚蠢的错误。现在它应该可以工作了。感谢约翰。【参考方案2】:

虽然另一个回答了您的问题,但这是使用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";

【讨论】:

以上是关于如何在 C++ 中使用输入重定向添加整数的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个可执行文件中将数据重定向到标准输入?

使用重定向输入和输出的 C++ 进程间通信不适用于发布版本

sublime编译器C++配置 -重定向输入输出

Linux重定向(输入重定向 | 输出重定向)

如何在 Laravel 中使用旧输入重定向?

Python 输入输出重定向