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

在 Linux 上,您可以将sprintf呼叫替换为

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)); 

不要忘记,#include <errno.h>仔细阅读errno(3)手册页。

顺便说一句,你可以避免同时做snprintfprintf简单的代码

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

(正如乔纳森提醒的那样,错误报告通常转到stderr

然后再次运行您的程序。也许您对字符编码有疑问(在源文件中或在文件系统中)。

你也可以在你的程序上使用strace(也许是ltrace)来理解它正在执行的实际系统调用。

于 2012-10-19T10:21:27.463 回答