3

ファイルのオープンまたはクローズに失敗した理由について、ユーザーにもう少し説明するステートメントを含めようとしています。書き込みモードでファイルを開くことができない状況と、ファイルを閉じることができない状況にはどのようなものがありますか?

FILE *fp;

if(!(fp = fopen("testing", "w")))
    {
    fprintf(stderr, "\nError %d: Loading from \"testing\" file failed: %s\n",
    errno, strerror(errno));
    printf("Add additional explanations here\n");
    }

fclose(fp);
4

5 に答える 5

2

書き込みモードでファイルを開こうとしたときに発生する可能性のあるエラーは、OS 固有です。しかし、基本的には、プログラムを実行している所有者またはユーザーがファイルに書き込む権限を持っていないということです。

fclose についても同様です。これは OS 固有ですが、自動的に fflush を実行するため、これは、たとえばディスクに十分なスペースがない場合に失敗する可能性がある操作です。

于 2013-12-19T23:05:48.833 に答える
1

fopen 関数はシステムコールです。そのため、失敗の理由は OS に大きく依存します。

getLastError()OS ( Windows およびerrnoLinux)に応じて呼び出して、どのエラーが発生したかを確認できます。さらに、通常、POSIX システムには、errno.h と呼ばれる番号を理由にマップするヘッダー ファイルがあります。

例として、errno に関する Linux のマニュアル ページを次に示します。

http://man7.org/linux/man-pages/man3/errno.3.html

于 2013-12-19T23:08:54.153 に答える
0

まず、使用してみてperrorください (こちらを参照)。

また、 のエラーのリストがfopenPOSIX ページ ( http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html ) にリストされています。

上記の抜粋:

[EACCES] パス プレフィックスのコンポーネントで検索権限が拒否されているか、ファイルが存在し、モードで指定された権限が拒否されているか、ファイルが存在せず、作成するファイルの親ディレクトリに対する書き込み権限が拒否されています。

[EINTR] fopen() 中にシグナルが捕捉されました。

[EISDIR] 指定されたファイルはディレクトリであり、モードには書き込みアクセスが必要です。

[ELOOP] パス引数の解決中に検出されたシンボリック リンクにループが存在します。

結局、エラーをすぐに出力したい場合、またはおそらくエラーをより高いレベルに戻して解析したい場合は、すべてが要約されます。ユーザーは、シンボリック リンクのループを気にしない/知らないかもしれません。

于 2013-12-20T09:10:00.690 に答える
-1

Windows は、ファイルの拡張子に依存して、データ ファイルとそれを開くために使用されるアプリケーションを関連付けます。これをファイルの関連付けと呼びます。ファイル拡張子に関連付けられたアプリケーションは、デフォルト プログラムと呼ばれます。データ ファイルをダブルクリックし、Windows がファイル拡張子を調べて、ファイルを開くために呼び出すアプリケーションがわからない場合、エラー メッセージが表示されます。この問題の解決策は、データ ファイルのファイル拡張子に対するファイルの関連付けを変更することです。

于 2017-10-31T00:49:47.640 に答える