gpt4 book ai didi

C fopen 到特定目录

转载 作者:可可西里 更新时间:2023-11-01 11:24:12 24 4
gpt4 key购买 nike

所以我正在尝试创建一个程序,该程序将根据系统是 Windows 还是 Linux 更改 fopen() 函数的文件目录。

在我的主要功能中,我通过

确定操作系统
#ifdef __unix
printf("linux machine \n");
windows = false;
linux = true;
#endif

#ifdef _WIN32
printf("windows machine \n");
windows = true;
linux = false;
#endif

然后在我打开文件的函数中

FILE *fp, *fpo;
if ((windows == true) && (linux == false))
{
fp = fopen("/temp/coursein/p1-in.txt", "r");
fpo = fopen("/temp/courseout/p1-out.txt", "w");
}
else
{
fp = fopen("~/temp/coursein/p1-in.txt", "r");
fpo = fopen("~/temp/coursein/p1-in.txt", "w");
}

我已经尝试了我能想到的“/”“//”“\”“\”的所有变体,在 Linux 上我遇到了段错误,在 Visual Studio 中我遇到了调试断言失败。表达式:stream != nullptr

最佳答案

您在 linux 版本中遇到崩溃很可能是因为在将流指针传递给流函数之前未检查流指针是否为 NULL

假设 fopen() 总是成功是糟糕的编程习惯。始终检查 fopen() 和许多其他库函数的返回值。

linux版本好像有错别字:fpo = fopen("~/temp/coursein/p1-in.txt", "w");应该是 fpo = fopen("~/temp/courseout/p1-out.txt", "w");

此外,fopen 不会将初始的 ~/ 扩展到用户的主目录,shell 在命令行而不是标准 C 库上执行此操作。在 unix 中,您可以使用 getenv("HOME") 检索用户的主目录,并使用 snprintf 编写要打开的文件名。您可以为 fopen 编写一个包装函数来处理系统特定的行为并返回流句柄。

有一个更简单的修复方法:您可以使路径相对于当前目录:

    fp = fopen("temp/coursein/p1-in.txt", "r");
fpo = fopen("temp/courseout/p1-out.txtt", "w");

    fp = fopen("coursein/p1-in.txt", "r");
fpo = fopen("courseout/p1-out.txt", "w");

只要您从适当的目录运行该程序或使用 chdir 更改启动函数中的当前目录(您测试在哪个操作系统上运行),它就可以在 linux 和 windows 中运行。

关于C fopen 到特定目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com