Написание смеси ascii и двоичных данных на Фортране - PullRequest
0 голосов
/ 15 февраля 2019

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

Я понимаю, что двоичное различие или различие ASCII должно быть сделано в операторе file-OPEN (в FORM = 'BINARY', предпочтительно: ACCESS = 'STREAM').Я не понимаю, как написать файл для нужного мне формата.

То, что я пытаюсь вывести:

ascii keyword  
ascii keyword  
ascii keyword  
ascii keyword  
ascii keywords "variable value in ascii" ascii keywords   
.....SOME BINARY DATA ....
.....................

Что я использую:

write(fl) "# vtk DataFile Version 3.0"//CHAR(13)//CHAR(10)  
write(fl)"Flow Field"//CHAR(13)//CHAR(10)  
write(fl)"BINARY"//CHAR(13)//CHAR(10)  
write(fl)"DATASET UNSTRUCTURED_GRID"//CHAR(13)//CHAR(10)  
write(fl)"POINTS",npoints,"float"    -------------> gives value of npoints(example:8) in binary format

Какой вывод должен быть:

# vtk DataFile Version 3.0
Flow Field
BINARY
DATASET UNSTRUCTURED_GRID
POINTS 8 Float
.....SOME BINARY DATA ....
.....................

Что такое вывод:

# vtk DataFile Version 3.0
Flow Field
BINARY
DATASET UNSTRUCTURED_GRID
POINTSÒ^O^@^@float
.....SOME BINARY DATA ....
...................

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Во-первых, вы найдете примеры написания файлов VTK в Интернете, как в вопросах двоичный vtk для Rectilinear_grid из кода Fortran не может работать с Paraview и двоичный VTK для RECTILINEAR_GRID из кода Fortran в различных исследовательских кодах с открытым исходным кодом, таких как https://bitbucket.org/LadaF/elmm/src/866794b5f95ec93351b0edea47e52af8eadeceb5/src/simplevtk.f90?at=master&fileviewer=file-view-default (это мой упрощенный пример, их гораздо больше) или в специализированных библиотеках, таких как http://people.sc.fsu.edu/~jburkardt/f_src/vtk_io/vtk_io.html (есть также библиотека VTKFortran дляXML-файлы VTK).

Кстати, даже если вы работаете в Windows, вы не должны использовать соглашения о конце строки в двоичных файлах VTK.Завершите свои строки просто achar(10) (или константой new_line от iso_fortran_env).И не забывайте, что двоичные данные должны быть бигендарными.В приведенных выше ссылках приведены примеры того, как с этим справиться.

В-третьих, чтобы поместить целое число в строку, у нас огромное количество дубликатов.Я имею в виду действительно огромный.Начните здесь Преобразуйте целые числа в строки для создания выходных имен файлов во время выполнения , и я буду бессовестно рекомендовать свою функцию itoa, потому что она значительно упростит ваш код.

write(fl)"POINTS ",itoa(npoints)," float" 
0 голосов
/ 16 февраля 2019

Я бы заменил

write(fl)"POINTS",npoints,"float"

на

BLOCK
   integer, parameter :: big_enough = 132 ! Or whatever
   character(big_enough) line
   write(line,'(*(g0))')"POINTS ",npoints," Float"//achar(13)//achar(10)
   write(f1) trim(line)
END BLOCK
...