首页 > 解决方案 > Ifstream 无法加载文件并且无法打开

问题描述

由于我制作 3ds 自制程序是为了好玩,因此其中一些代码对您来说可能看起来很陌生,但它本质上是相同的,但您可以输入额外的代码行。我正在尝试在单独的文件夹中读取一个名为 about.txt 的文件。当我把它放在同一个文件夹中时,我让它工作了,但我丢失了那个文件,然后我的伙伴说他想要它Scratch3ds-master\assets\english\text而不是Scratch3ds-master\source我不断收到我编码的错误。我是堆栈溢出的新手,所以这可能是代码太多,但这里是代码:

#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);
    }

标签: c++fstreamifstreamnintendo-ds

解决方案


您可能正在使用 devkitpro 软件包。devkitpro 团队很有可能为 3DS 编程提供了与 NDS 'ARGV 协议'相当的东西。在这种情况下,如果您使用

int main(int argc, char* argv[]);

argv[0]如果argc非零,您应该拥有可执行文件的完整路径。

https://devkitpro.org/wiki/Homebrew_Menu可能会有所帮助。

您的程序没有关于main()应该接收哪种参数的先验知识,并且在您的问题中,您正在使用一个根本不接收任何参数的 main 函数。

C/C++ 编程的既定标准是main()接收常量 C 字符串数组(通常以argv参数命名和该数组中有效条目的数量(通常以argc计数命名)。如果您将原始代码替换为

#include <fstream>
#include <string>
#include <iostream>

int main(int argc, char* argv[])
{
   // Initialize the services
   // ... more code follows

然后您就可以通过测试判断您是否收到了参数,argc > 0并且您可以使用argv[i].

使用 homebrew 开发,您不太可能在典型的命令行工具上传递诸如--force--directory=/bootas 之类的参数,但有一点仍然有用:第一个入口argv应该是正在运行的程序的完整路径。所以欢迎你尝试

std::cerr << ((argc > 0) ? argv[0] : "<no arguments>");

看看你得到了什么。


推荐阅读