【问题标题】:'fopen' returns NULL - "no such file or directory"'fopen' 返回 NULL - “没有这样的文件或目录”
【发布时间】:2013-09-26 09:51:34
【问题描述】:

我编写了一个超级简单的 C 命令行工具,它应该从argv[1] 中指定的路径中读取文件。我在 OS X 上使用Xcode 进行调试,因此运行时的工作目录是一个 Xcode 创建的目录,与我要读取的文件分开。 (Xcode 会自动插入参数,所以这不是问题。)我怀疑问题与我不了解 fopen 的工作原理有关。当我输入路径名时,它是否相对于工作目录?如果我使用绝对路径,它会工作吗?

我检查了this postthis onethis one,但在这种情况下它们似乎对我没有帮助。

这是我正在使用的代码 - 它在 main 函数中:

for (int i = 0; i < argc; i++)
    printf("arg%i: %s\n", i, argv[i]);

if (argc > 1)
{
    //Open the file specified by the first argument
    system("pwd");
    FILE *file = fopen(argv[1], "r");    //Always returns NULL

    if (file)
        //This isn't ever reached
    else
        printf("%s\n", strerror(errno));        
}

输出如下:

arg0: /Users/home/Library/Developer/Xcode/DerivedData/VSSequenceAlignment-avlfehlrtqiybygqfgueezoysnyi/Build/Products/Debug/VSSequenceAlignment
arg1: C:/Users/venkateshsivaramanDP/Documents/test/testdoc.txt
/Users/venkateshsivaramanDP/Library/Developer/Xcode/DerivedData/VSSequenceAlignment-avlfehlrtqiybygqfgueezoysnyi/Build/Products/Debug
No such file or directory

将 arg1 更改为使用正斜杠后,它并没有改变错误。诚然,它离实际问题更近了一步。

【问题讨论】:

  • argv[0] 似乎是 OSX 风格的路径,而 argv[1] 似乎是 Windows 风格的路径;这是怎么回事?
  • 我认为有些人在我链接的其中一个 SO 帖子上使用了反斜杠。在你这么说之前,在我看来并没有什么不同。

标签: c xcode terminal fopen


【解决方案1】:

你的路错了;您使用的是 Windows 路径。

将您提供的路径与 arg0 进行比较,指定可执行文件的路径。 arg1 必须是相同的样式。

【讨论】:

  • 如果你的意思是反斜杠,改变它们并没有帮助。我仍然遇到同样的错误。
  • unix 路径不以C: 开头。转到您要在终端中打开的文件并执行echo $(pwd)/file_you_want_to_open。这是您需要提供的路径。
  • 我们去!谢谢,原来是C:导致问题。如果您想将其添加到您的答案中,我会继续接受它。因为我可能需要使用外部磁盘来存储我将来要读取的文件,我将如何提供该路径?
  • 这完全取决于操作系统。在 OSX 中,此类卷位于 /Volumes/ 中,而在其他系统中,例如 ubuntu 或 debian,通常位于 /mnt/
  • 感谢您的帮助!
【解决方案2】:

是的,绝对路径适用于fopen,但这不是您的问题。我认为您的问题来自arg[1] 的内容,并且我认为它包含C:\Users\home\Documents\test\testdoc.txt 这是一个Windows 路径并且您在OS X 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多