【问题标题】:Opening a file in Mac OS X在 Mac OS X 中打开文件
【发布时间】:2010-04-10 23:52:37
【问题描述】:

我试图在 Mac OS X 中使用 C++ 打开一个文本文件,但总是遇到总线错误。

我不在乎把文件放在哪里。我只需要阅读它。我写错地址了吗?还是说 Bus Error 有其他原因?

FILE *dic;
dic = fopen("DICT","rb");

dic = fopen("./DICT","rb");

dic = fopen("~/DICT","rb");

dic = fopen("~//DICT","rb");

【问题讨论】:

  • 那是 C,不是 C++。您确定要使用 C++ 而不是 C?
  • 如果文件存在于当前目录中,我不明白为什么它不起作用。你能发布更多的上下文代码吗?
  • 嗯,比预期的行为。如果dicNULL,则不能将其作为fseek 的参数。它恰好可以在 PC 上运行,因为在这种情况下可以打开文件,所以 dic 不是 NULL
  • ...当然你应该检查从fopen返回的值,即使你拼写正确的文件路径!
  • ~ 可能不会像您期望的那样扩展(因为它通常由外壳扩展)。您需要使用其他方法来查找主目录,例如应该存在于 BSD/OS X 下的 $HOMEgetwpent

标签: c file macos


【解决方案1】:

稍微澄清一下,我发现您的 C 代码(不是 C++!)中的问题是 fopen() 返回 NULL。您可以通过报告详细错误来检查问题到底是什么:

if( (dic = fopen("DICT", "rb") == NULL ) {
    fprintf(stderr, "%s\n", perror("ERROR:"));
    exit(1);
}

如果fopen() 无法在用户桌面上找到该文件,并且您希望您的代码在多个平台上工作,那么您可以定义一个函数来获取用户桌面目录以与fopen() 一起使用。类似的东西

char* user_desktop(char* buf, size_t len)
{
    const char* const DESKTOP_DIR = 
#ifdef PC
    "C:\\Documents and Settings\\Pooya\\Desktop\\"
#elif defined(OSX)
    "/Users/Pooya/Desktop/"
#elif defined(LINUX)
    "/home/users/pooya/Desktop/"
// fail to compile if no OS specified ...
#endif
    return strncpy(buf, DESKTOP_DIR, len);
}

您可能希望研究一种更可靠的方法来获取每个操作系统的桌面路径。大多数操作系统都有用于此的 API,因此请进行研究。对于各种平台,还有更强大的拆分行为的方法,您可以对此进行研究或提出不同的问题。我只是想表达我的想法,无论您在哪个平台上编译代码,都有一个函数可以返回适当的桌面路径。

【讨论】:

  • 硬编码路径不是可移植的解决方案。
  • 是的,我只是想清楚说明我的意思。大多数操作系统都有用于获取此类路径的 API,但将其放入代码中会分散我的注意力。
  • 文件有问题。我已经再次保存它,它现在可以工作了。
【解决方案2】:

这段代码是正确的!注意可执行文件所在的目录。确定执行的目录与您期望的不一样(我想是.c 文件的目录,对吧?)。

我相信您正在从 IDE 执行应用程序。这在 Xcode 中很常见,它将 exec 安装在项目文件所在位置之外的另一个位置,并且在执行程序时会考虑这个位置,无论您是否从 IDE 执行它!

只需将要读取的文件移动到应用程序所在位置即可正常工作。

【讨论】:

  • 该文件可能不在正确的位置,但被质疑者似乎并不依赖于它位于与当前目录相关的目录中,因为他的一些示例与他的主目录相关。此外,将文件移动到应用程序目录并不总是可行的!
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
相关资源
最近更新 更多