【问题标题】:Reading a text file using a relative path使用相对路径读取文本文件
【发布时间】:2012-01-26 06:31:23
【问题描述】:

我正在寻找使用 C++ 中的相对路径读取文本文件。目录结构如下:source -> Resources -> Settings -> Video.txt.

文件的内容(注意:这些当然是用来测试的):

somes*** = 1
mores*** = 2
evenmores*** = 3

根据我的研究,这是可能的。不过,我发现这还没有奏效。例如,当我单步调试调试器时,用于接收逐行文本文件输入的 char *line 变量始终为常量 8。据我了解,char 指针可以充当您可以重新分配的动态字符数组。

为什么我无法读取我的文件?当我尝试执行 if ( !videoSettings ) 时,它返回 true,并且我收到一条错误消息(由我自己创建)。

代码

#ifdef WIN32
    const char *filePath = "Resources\\Settings\\Video.txt";
#else
    const char *filePath = "Resources/Settings/Video.txt";
#endif

    std::ifstream videoSettings( filePath );

    if ( !videoSettings )
    {
        cout << "ERROR: Failed opening file " << filePath << ". Switching to configure mode." << endl;

        //return false;
    }

    int count = 0;

    char *line;

    while( !videoSettings.eof() )
    {
        videoSettings >> line;

        cout << "LOADING: " << *line << "; ";

        count = sizeof( line ) / sizeof( char );

        cout << "VALUE: " << line[ count - 1 ];

        /*

        for ( int i = count; i > count; --i )
        {
            if ( i == count - 4 )
            {

            }
        }

        */
    }

    delete line;

【问题讨论】:

    标签: c++ file-io char text-files


    【解决方案1】:

    哇,好的——你不能把一串文本读成一个字符 * 你需要先预分配内存。

    第二个 char* 指针的大小是恒定的 - 但它指向的数据的大小不是

    我建议使用 std::string getline 调用并避免所有动态内存分配

    原来是这样

    std::ifstream in("file.txt");
    std::string line;
    while(getline(in, line))
    {
        std::cout << line << std::endl;
    }
    

    最后,相对路径是代码示例中的最后一个问题 :-)

    【讨论】:

    • 好的,谢谢。不过,快速的问题是:如果您正在寻找速度和优化,那么动态内存分配和这样一种更好的方法不是吗?
    • 技术上固定长度的数组“可能”会更快,但会给您带来无穷无尽的问题。第 1 课 - 永远不要优化,除非它被证明很慢。 STL 库已经为您完成了第二次动态内存分配。因为 STL 正在做这件事——它可以做你作为程序员永远做不到的各种优化(即让编译器去做)
    • 哦,第 3 课 :-) 以最简单的版本编写您的代码 - 然后在其缓慢更改之后 - 否则保持超级简单且以最少的行数可读
    • Opps - 忘了添加 - 使用 std::getline 时,您将动态内存分配卸载到 STL,而不是编写已经执行相同操作的代码。内存仍然是动态分配的——作为程序员的你不必关心它是如何或为什么完成的
    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多