Почему мой цикл while не возвращает правильные значения из файла? - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь написать простую программу для подсчета количества |трубы, которые появляются в строке до того, как определенное входное значение встречается в файле значений, разделенных трубами.

Я попытался создать цикл while, который проходит через каждый символ файла и увеличивает его на 1 каждый раз, когда значение FileInputStream.read () возвращает 124 (значение байта для Pipe), но затем сбрасывается на 0, еслиFileInputStream.read () возвращает 10 (значение байта для новой строки) и увеличивает счетчик строк + 1.

while((filereader=fis.read())!=searchValue){

        int filereader = byteVal;
        if(byteVal == 10)
        {
            lineCt++;
            finalPipCT = 0;

        if(byteVal == 124)
        {
           pipeCtr++;
        }
        finalPipCT = finalPipCt + lineCt;
        System.out.println("Data: " + sippyStraw + "\t" + (char)sippyStraw);


  }
  System.out.println("Total | in line: "+ finalPipCT );
  System.out.println("Total lines til value: "+ lineCt );
}

Если текстовый файл был таким:

|a|b|c|

|d|e|f

|g|h|i|j|

|k|l|m||n|

и searchValue было "h", я ожидаю, что он вернет:

Всего |в строке: 2
Общее количество строк до значения: 3

Количество каналов, которые встречаются в строке от начала указанной строки до совпадения значения h.

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Сначала некоторые очевидные проблемы:

  • int filereader = byteVal;# - назад
  • отсутствует первая конечная скобка оператора в первом операторе if.
  • finalPipCT = finalPipCt + lineCt;# finalPipCt должно быть finalPipCT

Лучшим решением было бы прочитать поток в строку (BufferedReader) за раз, а затем проанализировать символы в строке. Причина в том, что вы делаете предположение, что разделитель строк равен 10. Для файлов Windows это другое. Если вы используете буферизованный читатель для чтения строки, тогда EOL обрабатывается для вас.

Ваш цикл while должен читать строки, пока значение не станет нулевым. Ваш код будет пытаться прочитать байт даже после окончания файла (если он никогда не найдет байт поиска).

0 голосов
/ 06 октября 2019

Это сработало для меня:

    String text = "|a|b|c|\n" + 
                "|d|e|f\n" + 
                "|g|h|i|j|";
    int lineCt = 1;
    int finalPipCT = 0;
    int searchVal = 104;

    for(int i = 0; i < text.length() && text.charAt(i) != 'h'; i++) {
    //while (scanner.hasNextByte() && (scanner.nextByte() != searchVal)) {
        int byteVal = (byte) text.charAt(i);

        if(byteVal == 10) {
                lineCt++;
                finalPipCT = 0;
        }

        if(byteVal == 124) {
            finalPipCT++;
        }   
    }

    System.out.println("Total | in line: "+ finalPipCT );
    System.out.println("Total lines til value: "+ lineCt );

Я удалил некоторые вещи, такие как "System.out.println (" Данные: "+ sippyStraw +" \ t "+ (char) sippyStraw); "

И" finalPipCT = finalPipCt + lineCt; "

Я также использовал строку вместо вашего файла.

...