【问题标题】:Why does getline reads only the first stroke?为什么 getline 只读取第一个笔画?
【发布时间】:2021-08-23 04:02:25
【问题描述】:

我的程序应该读取命令并用一个数字执行它们。它应该是 +, -, /, * 数字,但它只读取第一个笔画。

    ifstream fin("file.txt");
    string line;
    while(getline(fin,line))
    {
        if(line[0] == '+')
        {
            for(int i = 1; i < 10; i++)
            {
                n += line[i];
            }
            ss << n;
            double p = 0.0;
            ss >> p;
            res += p;
        }
        n = "";
        if(line[0] == '-')
        {
            for(int i = 1; i < 10; i++)
            {
                n += line[i];
            }
            ss << n;
            double m = 0.0;
            ss >> m;
            res -= m;
        }
        n = "";
        if(line[0] == '*')
        {
            for(int i = 1; i < 10; i++)
            {
                n += line[i];
            }
            ss << n;
            double di = 0.0;
            ss >> di;
            res *= di;
        }
        n = "";
        if(line[0] == '/')
        {
            for(int i = 1; i < 10; i++)
            {
                n += line[i];
            }
            ss << n;
            double mu = 0.0;
            ss >> mu;
            res /= mu;
        }
        n = "";
    }

文件示例:

+1
-2
*5

输出:

1

预期输出为 -5,但它输出 1。 为什么会发生,我该怎么办? ss是stringstream,n是string,res是double,strokes[]是string。

【问题讨论】:

  • 您的minimal reproducible example 不可重现。 ss 是什么? n? res?识别操作后为什么要循环?
  • 已编辑问题
  • 包含相关代码。 阅读我发布的链接。
  • 我可以再做一些假设,足以说明您的解决方案过于复杂,但不足以提供实际答案。这就是为什么学会正确提问如此重要的原因。它避免了这种毫无价值的来回,直接解决了问题。我还建议再次阅读How to Ask。我会说这是第一次尝试,非常好。
  • p = n; 将是一种更简单的方法。甚至更简单:res += n;,没有中间变量,也没有强制转换。

标签: c++ ifstream getline


【解决方案1】:

你自己发现了。您必须清除std::istringstream 或定义一个新的,即使名称相同。所以你可以写

    ss.clear(); // Clear EOF bit
    ss.str(std::string()); // Clear buffer

在下一次插入操作之前,或者,您只需通过编写每次定义一个新变量:

    std::stringstream ss{};
    ss << n;

我还将您的代码修改为最小可重现示例:

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>

int main() {

    std::string line{};
    std::stringstream ss{};
    std::string n{};
    double res{};

    std::ifstream fin("file.txt");

    while (std::getline(fin, line))
    {
        if (line[0] == '+')
        {
            for (int i = 1; i < line.length(); i++)
            {
                n += line[i];
            }
            ss << n;
            double p = 0.0;
            ss >> p;
            res += p;
        }
        n = "";
        if (line[0] == '-')
        {
            for (int i = 1; i < line.length(); i++)
            {
                n += line[i];
            }
            ss.clear(); // Clear EOF bit
            ss.str(std::string()); // Clear buffer
            ss << n;
            double m = 0.0;
            ss >> m;
            res -= m;
        }
        n = "";
        if (line[0] == '*')
        {
            for (int i = 1; i < line.length(); i++)
            {
                n += line[i];
            }
            ss.clear(); // Clear EOF bit
            ss.str(std::string()); // Clear buffer
            ss << n;
            double di = 0.0;
            ss >> di;
            res *= di;
        }
        n = "";
        if (line[0] == '/')
        {
            for (int i = 1; i < line.length(); i++)
            {
                n += line[i];
            }
            ss.clear(); // Clear EOF bit
            ss.str(std::string()); // Clear buffer
            ss << n;
            double mu = 0.0;
            ss >> mu;
            res /= mu;
        }
        n = "";
    }
    std::cout << res;
    return 0;
}

我添加了一个更现代的 C++ 代码:

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>

int main() {
    
    if (std::ifstream ifs{ "file.txt" }; ifs) {

        double result{};
        for (std::string line{}; std::getline(ifs, line); ) {

            char calculationOperator{};
            double number{};

            std::istringstream iss{ line };
            if (iss >> calculationOperator >> number) {

                switch (calculationOperator) {
                case '+':
                    result += number;
                    break;
                case '-':
                    result -= number;
                    break;
                case '*':
                    result *= number;
                    break;
                case '/':
                    result /= number;
                    break;
                default:
                    std::cerr << "\n\nError: invalid mathematical operator '" << calculationOperator << "' found\n\n";
                }
            }
            else
                std::cerr << "\n\nError: Wronng input in line: " << line << "\n\n";
        }
        std::cout << "\n\nResult:  " << result << "\n\n";
    }
    else
        std::cerr << "\n\nError: Could not open 'file.txt'\n\n";
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多