Разница в выводе файла между жестко заданным путем к файлу и передачей в качестве аргумента командной строки - PullRequest
0 голосов
/ 01 марта 2020

Итак, я пишу программу, в которой я читаю из файла по одному символу за раз, выполняю операцию с символом, а затем записываю вывод в другой файл.

По какой-то причине я получаю другой результат, когда жестко кодирую путь к файлу (я сделал это просто для того, чтобы мне не приходилось вводить файл во время отладки) и когда я передаю файлы из командной строки ,

Когда я передаю файл из командной строки, он иногда пропускает строки ввода, поэтому, если у меня есть файл с 10 строками, я могу обработать только 8 строк.

У меня такое ощущение, что это как-то связано с тем, есть ли пробелы в конце строк ввода, но я не могу понять это. Любая помощь приветствуется.

Кроме того, я использовал NetBeans, когда жестко закодировал путь к файлу, и запускал программу из терминала, когда использовал аргументы командной строки. Я вставил код ввода / вывода ниже.

while( ( i = buffRead.read() ) != -1 )
{
    try
    {

        char c = (char) i;

        if ( Character.isWhitespace(c) )
        {
            if(converter.getStackSize() > 1)
            {
                converter.resetConverter();
                throw new IncorrectNumOfOperandsException();
            }

            buffRead.readLine();
            converter.resetConverter();
            writeOut.println();

        }
        else
        {
            converter.register( c );
        }
    }
    catch (InvalidCharException j)
    {
        writeOut.println("Invalid Character Entered\n");
        buffRead.readLine();
    }
    catch (IncorrectNumOfOperatorsException k)
    {
        writeOut.println("Too Many Operators for Number of Operands\n");
        buffRead.readLine();
    }
    catch ( IncorrectNumOfOperandsException m)
    {
        writeOut.println("Too Many Operands for Number of Operators\n");
        buffRead.readLine();
    }

}


buffRead.close();
writeOut.close();        

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

К сожалению, предоставленный вами код, похоже, не имеет ничего общего с вопросом!
Где два разных способа получения файла?

Также попробуйте использовать оператор try-with-resources. Примерно так:

try(final Reader         rdr = new InputStreamReader(System.in);
    final BufferedReader brd = new BufferedReader   (rdr))
{
    /*
     * Resources declared above will be automatically closed.
     */
    brd.readLine();
}

... это обеспечит закрытие всех файлов.

0 голосов
/ 01 марта 2020

Мне кажется, я вижу проблему.

Вы проверяете c, чтобы увидеть, является ли это символ пробела, и если это так, вы вызываете readLine(). Что readLine() делает, так это читает один или несколько символов, пока не дойдет до следующей последовательности конца строки.

Так что же происходит, когда c содержит символ новой строки?

  • символ новой строки - это пробел (ищите его)
  • , поэтому вы читаете строку, начиная с первого символа после символа новой строки, который вы только что прочитали
  • и Откажитесь от строки.

Итак, вы (случайно) выбросили полную строку ввода.

Решение ... Я оставлю вам.

Когда я передаю файл из командной строки, он иногда пропускает строки ввода ...

Я подозреваю, что то же самое происходило при вводе ввода ... но вы не сделали не замечаю этого. Но возможно, что что-то происходит с указанными платформой c последовательностями завершения строки.

...