Fortran non formaté format de fichier
Je ne comprends pas le format de sans mise en forme des fichiers en fortran.
Par exemple:
open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)
sorties d'une colonne d'une matrice dans un fichier. J'ai découvert qu'il dpa le fichier avec 4 octets sur la fin, cependant, je ne comprends vraiment pas pourquoi, ou comment contrôler ce comportement. Est-il un moyen de retirer le rembourrage?
Grâce
Changé le titre car je n'aime vraiment pas l'induire en erreur l'utilisation du terme "binaire". Binaire moyen en base 2, ce qui n'est pas directement connecté à votre problème. À peu près tout sur votre ordinateur est binaire, à un certain niveau. C'est un terme commun aujourd'hui, mais fortran "unformattted" est beaucoup plus proche.
Quelques infos utiles ici concernant les flux ... star.le.ac.royaume-uni/~cgp/streamIO.html
cela semble être un doublon de stackoverflow.com/questions/8751154/..., pourriez-vous s'il vous plaît de ne pas poster votre question à plusieurs reprises?
Quelques infos utiles ici concernant les flux ... star.le.ac.royaume-uni/~cgp/streamIO.html
cela semble être un doublon de stackoverflow.com/questions/8751154/..., pourriez-vous s'il vous plaît de ne pas poster votre question à plusieurs reprises?
OriginalL'auteur Andrew Spott | 2012-01-05
Vous devez vous connecter pour publier un commentaire.
Pour unformated IO, compilateurs Fortran généralement écrire la longueur de l'enregistrement au début et à la fin de l'enregistrement. La plupart, mais pas tous les compilateurs utilisent quatre octets. Cela facilite la lecture des enregistrements, par exemple, la longueur à la fin de l'aide avec un retour arrière de l'opération. Vous pouvez supprimer ce avec le nouveau Flux IO mode de Fortran 2003, qui a été ajouté pour la compatibilité avec d'autres langues. Utilisation accès= "stream" dans votre instruction open.
OriginalL'auteur M. S. B.
Je n'ai jamais utilisé d'accès séquentiel avec non formaté de sortie pour cette raison exacte. Cependant, il dépend de l'application et il est parfois pratique d'avoir une longueur d'enregistrement indicateur (en particulier pour les données non structurées). Comme suggéré par steabert dans En regardant de sortie binaire de fortran sur gnuplot, vous pouvez éviter cela en utilisant le mot-clé argument
ACCESS = 'DIRECT'
, dans ce cas, vous devez spécifier la longueur d'enregistrement. Cette méthode est pratique pour le stockage efficace de grandes multi-dimensionnelle des données structurées (constante de longueur d'enregistrement). L'exemple suivant écrit un sans mise en forme de fichiers dont la taille est égale à la taille de la matrice:Noter que ce n'est pas la meilleure approche dans le sens de la portabilité. Dans un sans mise en forme de fichiers écrits avec accès direct, il n'y a aucune information sur la taille de chaque élément. Un fichier texte lisez-moi, qui décrit la taille des données de fait le travail très bien pour moi, et je préfère cette méthode à la place de rembourrage en mode séquentiel.
OriginalL'auteur milancurcic
Fortran IO est l'enregistrement en fonction, non pas basé sur les flux. Chaque fois que vous écrivez quelque chose à travers
write()
vous n'êtes pas seulement l'écriture des données, mais également de début et de fin des marqueurs pour cet enregistrement. Deux enregistrer les marqueurs sont de la taille de cet enregistrement. C'est la raison pour laquelle la rédaction d'un tas de reals en une seule écriture (un enregistrement: - on commencer marqueur, le bouquet de reals, un marqueur de fin) a une taille différente à l'égard de l'écriture de chaque réel dans une autre écriture (plusieurs enregistrements, chaque de commencer un marqueur, un vrai, et un marqueur de fin). Cela est extrêmement important si vous écrivez vers le bas de matrices de grande taille, comme vous avez pu le ballon de l'occupation si mal écrit.qui est le plus communément (99.999 %).
Environ la moitié de mon code utilise "directe" de l'accès, de Sorte que ferait-il seulement 50% pour moi 😛
OriginalL'auteur Stefano Borini
Fortran non Formaté IO je suis assez familier avec les différentes sorties à l'aide de l'Intel et de compilateurs Gnu. Heureusement, ma vaste expérience datant des années 1970 IBM m'a permis de décoder les choses. Gnu plaquettes de dossiers avec 4 octets entier compteurs donnant la longueur de l'enregistrement. Intel utilise un 1 octet compteur et un certain nombre de incorporés codage des valeurs pour signifier une poursuite d'enregistrement ou à la fin d'un comte. On peut encore avoir de très longues longueurs d'enregistrements, même si seulement 1 octet est utilisé.
J'ai un logiciel compilé par le compilateur Gnu que j'ai eu à le modifier de sorte qu'il pourrait lire un non formaté fichier généré par le compilateur, il a pour détecter le format qu'il trouve. La lecture d'un non formaté fichier généré par le compilateur Intel (qui suit le "vieux" IBM jours) prend "pour toujours" à l'aide de Gnu fgetc ou d'ouvrir le fichier en mode "stream". La conversion du fichier à quel Gnu attend les résultats d'un facteur allant jusqu'à 100 fois plus rapide. Cela dépend de la taille de votre fichier si vous voulez embêter avec détection et de conversion ou pas. J'ai réduit mon programme de démarrage (qui ouvre une grande sans mise en forme de fichiers) à partir de 5 minutes 10 secondes. J'ai dû ajouter dans les options de la reconversion d'un retour à nouveau si l'utilisateur veut prendre le fichier à un processeur Intel programme compilé. C'est une douleur, mais là vous allez.
OriginalL'auteur William Jacobs