当前位置: 首页 > 知识库问答 >
问题:

InputStreamReader。read()不读取/跳过第一个字符?

王旺
2023-03-14

我试图编写一个简单的复数计算器,可以计算以下表达式:

  • 输入1:(10 30i)(90 20i)
  • 预期输出:(100 50i)
  • 输入2:(10 30i)-(90 20i)
  • 预期输出:(-80 10i)

编辑:我注意到第一次前瞻读取是10而不是40(ascii值 '(' ) . 我如何解决这个问题?

我的代码:

import java.io.*;
import static java.util.Objects.requireNonNull;

public class Parser {

    private int lookahead;
    private StreamTokenizer tokenizer;
    private final Reader input;
    private final Writer output;
    
    
    public Parser(Reader input, Writer output) throws IOException {
        this.input = requireNonNull(input);
        this.output = requireNonNull(output);
        this.lookahead = this.input.read();
    }
    
    private void next() throws IOException {
        lookahead = tokenizer.nextToken();
    }
    
    private void match(int expected) throws IOException {
        
        if (lookahead != expected) {
            
            switch(expected) {
            
                case '(':
                    System.out.println("Error, missing opening round bracket.");
                    break;
                
                case ')':
                    System.out.println("Error, missing closing round bracket.");
                    break;
                    
                case 'i':
                    System.out.println("Error, missing i");
                    break;
                    
                case '+':
                    System.out.println("Error, missing +");
                    
                default:
                    return;
            }
        } else {
            next();
        }
    }
    
    private void parseExpr() throws IOException {
      
       long[] parameters = new long[4];
       int i = 0;
       
        if (lookahead == '(') {
            match('(');
            
            if (lookahead == StreamTokenizer.TT_NUMBER) {
                parameters[i] = lookahead;
                i++;
                next();
                
            } else {
                System.out.println("Not a number.");
                return;
            }
            
            match('+');
            
            if (lookahead == StreamTokenizer.TT_NUMBER) {
                parameters[i] = lookahead;
                i++;
                next();
            } else {
                System.out.println("Not a number.");
                return;
            }
            
            match('i');
            match(')');
            
            if(lookahead == '+'){
                next();
                parseExpr();
                System.out.println("(" + (parameters[0]+parameters[2]) + "+" +(parameters[1]+parameters[3]) + "i)");
            }
            
            if(lookahead == '-'){
                next();
                parseExpr();
                System.out.println("(" + (parameters[0]-parameters[2]) + "+" +(parameters[1]-parameters[3]) + "i)");
            }
        }
        
        System.out.println("Sorry, I can't help you");
    }
    
    public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(System.in);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(outputStream);

        Parser parse = new Parser(reader, writer);
        parse.parseExpr();

        writer.close(); // Close and flush output stream writer.

        String output = outputStream.toString();
        System.out.println("Output generated by parser: " + output);
    }
}

但它总是输出“对不起,我帮不了你。”

共有1个答案

梅欣然
2023-03-14

我已经测试了您的代码,我有两条意见可以帮助您:

  1. 您始终会收到相同的错误消息,因为您尚未将“令牌化器”日化,请尝试使用tokenizer=new-StreamTokenizer(reader) 在主方法中

我希望这有帮助,让我知道。

 类似资料:
  • 问题内容: 我正在尝试使用javax.smartcardio 读取智能卡(德语Gesundheitskarte) 在EF“ PD” 的定义中,其长度指定为850字节。内容应该是一个gzip压缩的ISO5589-15编码的XML字符串作为指定在这里 作为CommandAPDU,我发送 获取前256个字节。发送后 我得到下一个256个字节。 但是我如何得到其余的呢? 我怎么知道二进制数据何时结束? 德

  • 在 Mule 4 中,我正在读取一个大型 csv 文件进行转换,需要将内容写入数据库表。csv 文件没有标头。当我默认运行集成时,第一行被跳过,就好像默认值被预先确定为标题一样。 我看了一下应用程序类型。xml,看起来头被设置为false,如下所示 任何建议都将不胜感激。谢谢

  • 在 Lisp 表达式的一生中,有三个最重要的时刻,分别是读取期(read-time),编译期(compile-time) 和运行期(runtime)。运行期由函数左右。宏给了我们在编译期对程序做转换的机会。本章讨论读取宏(read-macro),它们在读取期发挥作用。 17.1 宏字符 按照 Lisp 的一般哲学,你可以在很大程度上控制 reader 。它的行为是由那些可随时改变的属性和变量控制的

  • 问题内容: 我有一个笨拙的csv文件,我需要跳过第一行来阅读它。 我正在使用python / pandas轻松做到这一点 但是我不知道如何在Go中做到这一点。 错误: : 问题答案: 读取csv文件时跳过第一行 例如, 输出:

  • 使用poi读取某些excel失败,遇到此错误 从,存在