最後に使用したとき (1 年前) に正常に動作したと断言できる MATLAB スクリプトがあります。今、私はこのエラーを受け取ります:
Invalid file identifier. Use fopen to generate a valid file identifier.
私の理解が正しければ、スクリプトの他の場所で指定されたファイルを見つけられない、または開く(?)ことができません。これは正しいですか?もしそうなら、何が原因でしょうか?
fid
(ファイル識別子) の出力ですfopen
。これは整数ですが、ファイルに永続的に関連付けられているわけではありません。fopen
を取得するには、を使用する必要がありますfid
。や などのファイル関連の I/O コマンドで、間違ったfid
(ファイル識別子)を使用しているようです。の付与に失敗しました。有効な通常のファイルの場合、成功すると、それ以上の整数が得られます。fread
fscanf
fclose
fopen
fid
-1
fopen
fid
3
ただし、コードがなければ、バグやエラーの場所や内容を特定することはできません。MATLAB デバッガーを使用して、関連するコードfopen
(そこにブレークポイントを設定し、プログラムを実行する) を関連するものまでシングルステップで実行し、 fclose
if fid
(またはファイル識別子に使用する変数名) またはファイル識別子のデータ構造 (持っている場合) を確認できます。コード内の複数のファイル識別子) は、関連するfopen
との間の任意のポイントで変更されますfclose
。
fopenに許可オプションを追加することで、この問題を自分で解決しました。http://www.mathworks.se/help/matlab/ref/fopen.htmlでわかるように、fopen の構文は次のとおりです。
fileID = fopen(filename,permission)
たとえば、可能なパーミッションは次のとおりです。'w' | 'a' | 'r+' | 'w+' | 'a+' | ...
'r' – ファイルを読み取り用に開きます。
'w' – 書き込み用に新しいファイルを開くか作成します。既存のコンテンツがある場合は破棄します。
'a' – 書き込み用に新しいファイルを開くか作成します。ファイルの末尾にデータを追加します。
'r+' – 読み書き用にファイルを開きます。
'w+' – 読み書き用に新しいファイルを開くか作成します。既存のコンテンツがある場合は破棄します。
'a+' – 読み書き用に新しいファイルを開くか作成します。ファイルの末尾にデータを追加します。
...
許可オプションなしで fopen を使用した場合、または 'r' (デフォルト) オプションを使用した場合、fopen はエラーである -1 を返します。私はこれで成功します:
fid=fopen('tmp.txt', 'w');
fid=fopen('tmp.txt', 'a');
ASF ツールボックスのデモを開こうとしたときに、同じ問題が発生しました。管理者としてMatlabを実行すると(右クリックして開く)、この問題が解決したようです。
この問題がありました。書き込もうとしていたファイルが大きすぎることが判明しました (それを格納するのに十分な空き容量がありませんでした)。ただし、プログラムは fclose の呼び出しまで失敗しませんでした。非常に紛らわしいです!
この診断をテストするには、スペースを解放するか、非常に小さなファイルを書き込んでみてください。
fopen
指定したファイルを読み書きする権限が MATLAB にないため、失敗する可能性があります。
あなた/MATLAB がすべての権限を持っている場所でファイルを開いてみてください (OS によって異なります)。
また、存在しないディレクトリにファイルを作成しようとしたときにも発生します。mkdir('folderName')
MATLAB 内で試すか、事前にディレクトリを作成してください。
先頭にスラッシュがあるパスでも、同じエラーが発生する可能性があります。
filename = '/data/myfile.txt';
このエラーをスローしますが、
filename = 'data/myfile.txt';
エラーは発生しません。
また、スクリプトがファイルの末尾を超えて読み取ろうとしたときにも発生します。