web-dev-qa-db-fra.com

Qu'est-ce qui cause un identifiant de fichier invalide dans MATLAB?

J'ai un script MATLAB que j'aurais juré de bien fonctionner la dernière fois que je l'ai utilisé (il y a un an). Maintenant, je reçois cette erreur:

Invalid file identifier.  Use fopen to generate a valid file identifier.

Si je comprends bien, il ne parvient pas à trouver ou à ouvrir (?) Un fichier spécifié ailleurs dans le script. Est-ce correct? Si oui, quelle pourrait en être la cause?

5
nikipedia

fid (identificateur de fichier) est la sortie de fopen. C'est un entier, mais pas lié au fichier en permanence. Vous devez utiliser fopen pour obtenir fid. Il me semble que vous utilisez une variable fid (identificateur de fichier) incorrecte dans certaines commandes d'E/S associées aux fichiers, telles que fread, fscanf ou fclose. En cas d'échec, fopen donne fid de -1. Pour tout fichier normal valide, fopen donnera fid qui est 3 ou un entier plus grand.

Cependant, sans code, il est impossible de dire où et quel est le bogue ou l'erreur. Vous pouvez utiliser le débogueur MATLAB pour exécuter en une seule étape le code de la variable fopen pertinente (définir le point d'arrêt et exécuter votre programme) jusqu'à la variable fclose correspondante et voir si fid (ou le nom de variable que vous utilisez pour l'identificateur de fichier) ou toute structure de données pour vos identificateurs de fichier. (si vous avez plusieurs identifiants de fichier dans votre code) change en tout point entre les variables fopen et fclose pertinentes.

10
nrz

J'ai résolu ce problème moi-même en ajoutantpermission option à fopen . Comme vous le voyez dans http: //www.mathworks .se/help/matlab/ref/fopen.html , la syntaxe fopen est la suivante:

fileID = fopen(filename,permission)

Les autorisations possibles, par exemple, sont: 'R' (par défaut) | 'w' | 'a' | 'r +' | 'w +' | 'a +' | ...

'r' - Ouvre le fichier en lecture.

'w' - Ouvre ou crée un nouveau fichier pour l'écriture. Jeter le contenu existant, le cas échéant.

'a' - Ouvrez ou créez un nouveau fichier pour l'écriture. Ajouter des données à la fin du fichier.

'r +' - Ouvre un fichier pour la lecture et l'écriture.

'w +' - Ouvre ou crée un nouveau fichier pour la lecture et l'écriture. Jeter le contenu existant, le cas échéant.

'a +' - Ouvre ou crée un nouveau fichier pour la lecture et l'écriture. Ajouter des données à la fin du fichier. 

...

Si j'utilise l'option fopen sans permission, ou si j'utilise l'option 'r' (par défaut), fopen renverra -1, ce qui est une erreur. Je réussis avec ceci:

fid=fopen('tmp.txt', 'w');
fid=fopen('tmp.txt', 'a');
8
Mindaugas

J'ai eu ce problème. Il s’est avéré que le fichier que j’essayais d’écrire était trop volumineux (je ne disposais pas de suffisamment d’espace libre). Cependant, le programme n'a échoué que lorsque l'appel à fermer. Très perturbant!

Essayez de libérer de l'espace ou d'écrire un très petit fichier pour tester ce diagnostic.

6
mp4man

J'ai rencontré le même problème en essayant d'ouvrir des démos de boîtes à outils ASF. Exécuter Matlab en tant qu'administrateur (clic droit pour l'ouvrir) semblait résoudre ce problème pour moi. 

6
Aaki

fopen peut échouer car MATLAB ne dispose pas des autorisations pour lire/écrire le fichier que vous avez spécifié.

Essayez d’ouvrir un fichier à un emplacement où/MATLAB a tous les droits (en fonction de votre système d’exploitation).

3
Maxime Lefrançois

J'ai utilisé fopen avec permission et la même erreur s'est produite. Cependant, j'ai commencé MATLAB en tant qu'administrateur et cela a résolu le problème.

1
abdul_penn

J'avais le fichier ouvert dans Excel et par conséquent, fopen a renvoyé -1. Il m'a fallu une éternité pour trouver un problème aussi trivial. 

0
masaguchi46

Le chemin avec une barre oblique au début peut provoquer la même erreur.

filename = '/data/myfile.txt';

jette cette erreur, alors que

filename = 'data/myfile.txt';

ne produit pas d'erreur.

0
Felix Solomon

Cela se produit également lorsque vous essayez de créer un fichier dans un répertoire inexistant. Essayez mkdir('folderName') dans MATLAB ou créez simplement le répertoire au préalable.

0
Juan Terven