OS X下的freopen()中无法使用相对路径打开文件?

时间:2016-04-14 09:10:00

标签: c

我正在学习使用freopen()将stdin重定向到文件。

我在OS X 10.10下,我正在使用Xcode来运行我的代码。

这是我的代码:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    freopen("../data.in", "r", stdin);
    char a;
    scanf("%c", &a);
    fclose(stdin);
    printf("%c", a);
   return 0;
}

修改 我在终端中使用tree命令来显示文件结构,输出是

.
├── competition
│   └── main.c
├── competition.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   │   ├── contents.xcworkspacedata
│   │   ├── xcshareddata
│   │   │   └── competition.xccheckout
│   │   └── xcuserdata
│   │       └── yang.xcuserdatad
│   │           └── UserInterfaceState.xcuserstate
│   └── xcuserdata
│       └── yang.xcuserdatad
│           ├── xcdebugger
│           │   └── Breakpoints_v2.xcbkptlist
│           └── xcschemes
│               ├── competition.xcscheme
│               └── xcschememanagement.plist
├── data.in
└── makefile

我还检查了freopen()的输出。函数返回NULL

当我将"../data.in"更改为绝对路径时,输出正确。

如何使用相对路径修复它?

2 个答案:

答案 0 :(得分:3)

相对路径与程序源所在的位置无关。它实际上是相对于当前工作目录&#34; (基本上,在shell窗口中键入pwd以查看您的工作目录是什么,然后运行该程序,如果../data.in中有&#sa;文件,它将起作用,否则您将会运行可能会得到各种奇怪的错误。)

你还应该检查freopen的返回值,如果它返回NULL,则发生错误,你应该处理它。

答案 1 :(得分:2)

要使用相对路径,您必须知道正在运行的进程的当前目录是什么。

请参阅getcwd()

如果从命令行启动程序,则当前目录与命令行相同。在命令行(shbash ...)中,命令pwd将告诉您您的位置。

如果从调试器启动程序,调试器将选择程序启动目录,这应该是调试器的一个选项。