Как метод read () в FileReader перемещается по файлу?

1

Поэтому я просто написал программу, которая читает конкретный файл и возвращает частоту каждого используемого символа. Это было сделано с использованием односвязного списка (а не java LinkedList, но очень похоже). Я хочу знать, почему это:

 while(txtFile.read() != -1){
             Character letter = (char) txtFile.read();
             freqBag.add(Character.toLowerCase(letter));
        }

не работает (он не возвращает правильную частоту данного символа), и почему это:

 int c;
 while((c = txtFile.read()) != -1){
             Character letter = (char) c;
             freqBag.add(Character.toLowerCase(letter));
        }

работает. Я написал первый, и друг помог мне исправить это.

  • 1
    Ни один из них не работает. Они оба обрабатывают только четные символы.
Теги:
file
io

2 ответа

3
Лучший ответ

Это не работает, потому что вы отбрасываете символы. Каждая функция read() возвращает следующий байт (как подписанный int), поэтому ваш код отбрасывает каждый символ (0, 2, 4...).

while(txtFile.read() != -1){        // Read and discard a character
    Character letter = (char) txtFile.read();  // Read a character into letter
    reqBag.add(Character.toLowerCase(letter)); // Store this letter
}

Код друга не должен работать:

int c;           // variable outside the loop
while((c = txtFile.read()) != -1){  // Read a character into c, compare to -1
    Character letter = (char) txtFile.read();  // Read another character
    freqBag.add(Character.toLowerCase(letter));  // Store this letter
}

Правильный метод должен был бы прочитать только один раз:

int c;
while((c = txtFile.read()) != -1) {
    freqBag.add(Character.toLowerCase((char)c));
}

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

  • 0
    О, да, это была опечатка. Это работает, когда символ буквы = (символ) с ;. Спасибо за объяснение!
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню