Ifstream 无法加载文件并且无法打开
Posted
技术标签:
【中文标题】Ifstream 无法加载文件并且无法打开【英文标题】:Ifstream is failing to load a file and it won't open 【发布时间】:2019-09-28 14:04:15 【问题描述】:有些代码对你来说可能看起来很陌生,因为我制作 3ds 自制程序是为了好玩,但它本质上是相同的,但你可以输入额外的代码行。我正在尝试读取一个名为 about.txt 的文件单独的文件夹。当我把它放在同一个文件夹中时我让它工作但我丢失了那个文件然后我的伙伴说他想要它在Scratch3ds-master\assets\english\text
而不是Scratch3ds-master\source
我不断收到我编码的错误。我是新来的堆栈-overflow 所以这可能是太多的代码,但这里是代码:
#include <fstream>
#include <string>
#include <iostream>
int main()
// Initialize the services
gfxInitDefault();
consoleInit(GFX_TOP, NULL);
int version_major;
int version_minor;
int version_patch;
version_major = 0;
version_minor = 0;
version_patch = 2;
printf("This is the placeholder for Scratch3ds\n\n");
std::ifstream about_file;
about_file.open("../assets/english/text/about.txt");
if (about_file.fail())
std::cerr << "file has failed to load\n";
exit(1);
【问题讨论】:
您正在使用 相对 路径打开文件,因此最可能的罪魁祸首是调用进程的 当前工作目录 不是您所期望的它是。打开文件时始终使用 absolute 路径。如果文件的位置是相对于EXE文件的位置,先动态获取EXE的绝对路径,去掉文件名,追加相对路径。 @RemyLebeau 如果我不知道文件的确切位置,我该怎么做?因为它在 3ds 上(我很确定驱动器被称为 0:/ 但这会导致汇编程序出错)我不知道整个路径 "如果我不知道文件的确切位置,我该怎么做?" - 就像我之前说的,查询当前进程的完整路径运行时,然后根据需要对其进行修改。我确信 3DS 有一些你可以使用的 API。或者,由于 3DS 是一个相当封闭的系统,文件夹路径可能是固定的,所以只需硬编码即可。 您是从 SD 卡加载此内容吗? SD 卡上的文件在哪里? 【参考方案1】:您可能正在使用 devkitpro 软件包。 devkitpro 团队很有可能为 3DS 编程提供了与 NDS 'ARGV 协议'相当的东西。在这种情况下,如果您使用
int main(int argc, char* argv[]);
如果argc
不为零,您应该在argv[0]
中拥有可执行文件的完整路径。
https://devkitpro.org/wiki/Homebrew_Menu 可能会有所帮助。
您的程序没有先验知识 main()
应该接收什么样的参数,并且在您的问题中,您正在使用一个根本不接收任何参数的主函数。
C/C++ 编程的既定标准是 main()
将接收一个常量 C 字符串数组(通常命名为 argv
用于 arguments values)和该数组中有效条目的数量(对于 count,通常命名为 argc
)。如果您将原始代码替换为
#include <fstream>
#include <string>
#include <iostream>
int main(int argc, char* argv[])
// Initialize the services
// ... more code follows
然后您可以通过测试argc > 0
来判断您是否收到了参数,并且您将能够通过argv[i]
获取这些参数值。
通过自制开发,您不太可能像在典型的命令行工具上那样传递 --force
或 --directory=/boot
之类的参数,但有一点仍然有用:argv
中的第一个条目应该是正在运行的程序的完整路径。所以欢迎你尝试
std::cerr << ((argc > 0) ? argv[0] : "<no arguments>");
看看你会得到什么。
【讨论】:
你能详细说明如何使用我没有经验的那行代码 我猜你对en.wikipedia.org/wiki/Entry_point很熟悉。查看更新的答案。以上是关于Ifstream 无法加载文件并且无法打开的主要内容,如果未能解决你的问题,请参考以下文章