4

私はファイル処理のためにcでコードを書きました。ファイル名にはドイツ語の文字が含まれています。このコードはWindowsで完全に機能しています。ただし、Linuxでは機能しません。fopenは「ファイルを開けませんでした」というエラーを出します。ファイルパスを確認しましたが、ファイルはそこにあります。また、そのフォルダの読み取り/書き込み権限があります。

コードは以下の通りです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    const char *fileName = "/users/common/haëlMünchen.txt";

    FILE * pFile;
    char errorMessage[256];
    pFile = fopen (fileName,"r");
    if (pFile != NULL)
    {
        fprintf (stdout,"fopen example",errorMessage);
        fclose (pFile);
    }
    else
    {
    sprintf(errorMessage, "Could not open file %s", fileName);
    fprintf(stdout, "%s\n", errorMessage);
    }
    return 1;
}

これに関する入力はありますか?

4

1 に答える 1

3

sprintfLinuxでは、呼び出しを次のように置き換えることができます

snprintf (errorMessage, sizeof(errorMessage), 
          "Could not open file %s - %m", fileName);

(一般的なヒントは、sprintfバッファ オーバーフローの可能性があるため回避し、 のみを使用することですsnprintf)

GLibc 固有の%m書式指定子を避け、より標準的な関数を使用する場合は、次のようにコーディングします。

snprintf (errorMessage, sizeof(errorMessage), 
          "Could not open file %s - %s",
          fileName, strerror(errno)); 

を忘れずに、errno(3)の man ページを注意深く#include <errno.h>読んでください。

snprintfところで、両方を行うことを避けることができprintf、単純にコーディングすることもできます

fprintf (stderr, "Cannot open file %s - %s\n",
        fileName, strerror(errno));

stderr(ジョナサンが思い出したように、エラー報告は通常 に送られます)

次に、プログラムを再度実行します。おそらく、文字エンコーディングに問題があります (ソース ファイルまたはファイル システムのいずれか)。

straceまた、プログラムで(およびおそらくltrace) を使用して、実行している実際のシステム コールを理解することもできます。

于 2012-10-19T10:21:27.463 に答える