Определение, заканчивается ли файл должным образом символом EOF

1

Я имею дело с проблемами, вызванными файлами, которые не были надлежащим образом завершены символом EOF.

Как определить, содержит ли файл правильный EOF, и правильно ли добавить его, если он отсутствует в Java/Scala?

  • 1
    Вы, должно быть, что-то пробовали.
  • 3
    Обычно файлы не заканчиваются каким-либо символом EOF, фактически ни один символ не обозначает конец файла, здесь возникает путаница. Вы можете открыть файл с помощью шестнадцатеричного редактора и посмотреть, есть ли какой-нибудь символ «EOF»; вы не найдете ни одного.
Показать ещё 2 комментария
Теги:
eof

1 ответ

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

Я имею дело с проблемами, вызванными файлами, которые не были надлежащим образом завершены символом EOF.

Собственно, я сомневаюсь, что это правда. Сверху моей головы я не могу думать о какой-либо основной операционной системе, где необходимо закончить файл с символом EOF. (В этой статье объясняется миф о "характере EOF" и почему ни ^ Z, ни ^ D не являются символами EOF. Да, некоторые оболочки интерпретируют один или другой как "маркеры EOF" при чтении входного потока пользователя через консоль, но это особый случай... и ваше приложение, конечно, не увидит ^ Z или ^ D, когда он прочитает поток.)

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

Возможно также, что ваша настоящая проблема - это нечто иное. Например, у вас могут быть файлы, в которых последняя строка не заканчивается распознаваемой последовательностью конца строки. Это, как известно, вызывает проблемы для некоторых классических утилит Linux/Unix.


Ради полноты, вот ответ на заданный вами вопрос.

Как определить, содержит ли файл правильный EOF, и правильно ли добавить его, если он отсутствует в Java/Scala?

Способ узнать, не завершился ли файл конкретным символом (например, ^ Z), - просто прочитать последний символ файла и проверить его. Например, в Java (untested):

import java.io.*;

public class TestForArcaneEOF {
    public static void main(String[] args) throws IOException {
        Reader reader;
        if (args.length == 0) {
            reader = new InputStreamReader(System.in);
        } else {
            reader = new FileReader(args[0]);
        }
        reader = new BufferedReader(reader);
        int last = 0;
        int ch;
        while ((ch = reader.read()) != -1) {
            last = ch;
        }
        if (last == 0x1a) {
            System.out.println("Ends with ^Z");
        } else {
            System.out.println("Doesn't end with ^Z");
        }
    }
}

Добавление символа (например, ^ Z) в конце файла еще проще:

  1. Откройте файл в режиме "добавить".
  2. Напишите символ.
  3. Закройте файл.

Ещё вопросы

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