Почему Fortran создает 12-байтовый двоичный файл, содержащий целочисленный и 16-байтовый двоичный файл, содержащий реальные * 8? [Дубликат]

Вам нужно, чтобы ваши классы контактов реализовали Comparable , а затем реализовали метод compareTo(Contact). Таким образом, Collections.sort сможет сортировать их для вас. На странице, с которой я связан, compareTo 'возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.'

Например, если вы хотел сортировать по имени (от А до Я), ваш класс будет выглядеть так:

public class Contact implements Comparable {

    private String name;

    // all the other attributes and methods

    public compareTo(Contact other) {
        return this.name.compareTo(other.name);
    }
}

15
задан Rook 7 January 2012 в 05:22
поделиться

4 ответа

Для неформатированных IO компиляторы Fortran обычно записывают длину записи в начале и конце записи. Большинство, но не все компиляторы используют четыре байта. Это помогает в чтении записей, например, длина в конце помогает с помощью операции backspace. Вы можете подавить это с помощью нового режима Stream IO для Fortran 2003, который был добавлен для совместимости с другими языками. Используйте access = 'stream' в вашем открытом заявлении.

19
ответ дан M. S. B. 24 August 2018 в 01:54
поделиться

Я никогда не использовал последовательный доступ с неформатированным выходом по этой точной причине. Однако это зависит от приложения, и иногда удобно иметь индикатор длины записи (особенно для неструктурированных данных). Как было предложено steabert в . Глядя на двоичный вывод fortran на gnuplot , вы можете избежать этого, используя аргумент ключевого слова ACCESS = 'DIRECT', и в этом случае вам нужно указать длину записи. Этот метод удобен для эффективного хранения больших многомерных структурированных данных (постоянная длина записи). Следующий пример записывает неформатированный файл, размер которого равен размеру массива:

REAL(KIND=4),DIMENSION(10) :: a = 3.141
INTEGER                    :: reclen

INQUIRE(iolength=reclen)a
OPEN(UNIT=10,FILE='direct.out',FORM='UNFORMATTED',&
     ACCESS='DIRECT',RECL=reclen)
WRITE(UNIT=10,REC=1)a
CLOSE(UNIT=10)

END

Обратите внимание, что это не идеальный aproach в смысле переносимости. В неформатированном файле, написанном с прямым доступом, нет информации о размере каждого элемента. Текстовый файл readme, описывающий размер данных, отлично подходит для меня, и я предпочитаю этот метод вместо заполнения в последовательном режиме.

6
ответ дан Community 24 August 2018 в 01:54
поделиться

Fortran IO основан на записи, а не на потоке. Каждый раз, когда вы пишете что-то через write(), вы не только записываете данные, но также начинаете и заканчиваете маркеры для этой записи. Оба маркера записи - это размер этой записи. Вот почему пишется куча реалов в одной записи (одна запись: один маркер начала, кучка реалов, один маркер конца) имеет другой размер в отношении записи каждого реального в отдельной записи (несколько записей, каждая одного маркера начала, одного реального и одного конечного маркера). Это чрезвычайно важно, если вы записываете большие матрицы, так как вы можете набросать оккупацию, если неправильно написаны.

5
ответ дан Stefano Borini 24 August 2018 в 01:54
поделиться

Fortran Unformatted IO Я хорошо знаком с различными выходами с использованием компиляторов Intel и Gnu. К счастью, мой огромный опыт, достигнутый в 1970-х годах IBM, позволил мне расшифровать все. Gnu pads записывает с 4 байтами целочисленных счетчиков, дающих длину записи. Intel использует 1 байтовый счетчик и ряд встроенных значений кодирования, чтобы обозначить запись продолжения или конец счета. Все еще может быть очень длинная длина записи, хотя используется только 1 байт. У меня есть программное обеспечение, скомпилированное компилятором Gnu, которое мне пришлось изменить, чтобы он мог читать неформатированный файл, сгенерированный компилятором, поэтому он должен определить, какой формат он находит. Чтение неформатированного файла, созданного компилятором Intel (который следует за «старыми» днями IBM), берет «навсегда» с помощью fgetc Gnu или открывает файл в поточном режиме. Преобразование файла в то, что Gnu ожидает, приводит к коэффициенту до 100 раз Это зависит от вашего размера файла, если вы хотите побеспокоиться об обнаружении и преобразовании или нет. Я сократил время запуска программы (которое открывает большой неформатированный файл) с 5 минут до 10 секунд. Мне пришлось добавить опции для преобразования назад, если пользователь хочет вернуть файл обратно в компилируемую программу Intel. Все это боль, но там вы идете.

1
ответ дан William Jacobs 24 August 2018 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: