我正在学习使用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"
更改为绝对路径时,输出正确。
如何使用相对路径修复它?
答案 0 :(得分:3)
相对路径与程序源所在的位置无关。它实际上是相对于当前工作目录&#34; (基本上,在shell窗口中键入pwd
以查看您的工作目录是什么,然后运行该程序,如果../data.in
中有&#sa;文件,它将起作用,否则您将会运行可能会得到各种奇怪的错误。)
你还应该检查freopen
的返回值,如果它返回NULL,则发生错误,你应该处理它。
答案 1 :(得分:2)
要使用相对路径,您必须知道正在运行的进程的当前目录是什么。
请参阅getcwd()
。
如果从命令行启动程序,则当前目录与命令行相同。在命令行(sh
,bash
...)中,命令pwd
将告诉您您的位置。
如果从调试器启动程序,调试器将选择程序启动目录,这应该是调试器的一个选项。