如何从文本文件填充指针数组?

时间:2019-01-14 11:04:44

标签: c++ text-files

我正在做一个应于今天到期的学校项目,但我陷入了一个可能很简单的问题。

我需要制作“ Hangman”游戏,而我遇到的任务是填充文本文件中的指针数组(我需要阅读图片以获取错误答案)。

parLapply

我的文本文件如下:

void ReadScenes(string *scenes[10])
 {
ifstream inFile("Scenes.txt");
if (inFile.is_open())
{
    int i = 0;
    string scene;
    while ((inFile >> scene)&&(i<10))
    {
        *scenes[i] = scene;
            i++;        
    }
}
}
int main()
{
  char *scenes[10];
  ReadScenes(scenes);
}

以此类推。

方法中的代码可用于读取密码,因为它们之间用空格分隔。所以我有10个场景,我想将它们保存在数组中。

2 个答案:

答案 0 :(得分:6)

一个问题是,您认为读取的文件应该是带有变量声明的类似C ++的文件。那不是它的工作原理。

您应该将文件的内容放入普通的C ++源文件中,并使用它进行构建。

类似

std::string scenes[] = {
    // Scene 1
    "                      \n"
    "                      \n"
    "                      \n"
    "                      \n"
    "                      \n"
    "                      \n"
    "       *              \n"
    "      * *             \n"
    "     *   *            \n",

    // Scene 2
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "      * *             \n"
    "     *   *            \n",

    // And so on...
};

如果使用IDE,则将源文件添加到项目中。

如果您使用例如g++然后在命令行上构建

g++ -Wall main.cpp scenes.cpp -o my_program

其中scenes.cpp是包含scenes数组的源文件。


如果您需要使用外部 text 文件而不使用任何C ++代码,则实际上非常容易:只需按原样存储文本,而无需使用引号或类似C ++声明或语句的任何内容。

由于您知道每个“场景”正好是9行(也许是用于分隔两个场景的额外行),因此您可以使用for循环读取该行。

这样您的文本文件就可以看起来像







           *              
          * *             
         *   *            

           *              
           *              
           *              
           *              
           *              
           *              
           *              
          * *             
         *   *            

然后加载

constexpr size_t NUMBER_OF_SCENES = 2;  // With the example scene file in this answer
constexpr size_t LINES_PER_SCENE = 9;

std::ifstream scene_file("scenes.txt");

std::array<std::string, NUMBER_OF_SCENES> scenes;

// Loop to read all scenes
for (std::string& scene : scenes)
{
    std::string line;

    // Loop to read all lines for a single scene
    for (unsigned line_number = 0; line_number < LINES_PER_SCENE && std::getline(scene_file, line); ++line_number)
    {
        // Add line to the current scene
        scene += line + '\n';
    }

    // Read the empty line between scenes
    // Don't care about errors here
    std::getline(scene_file, line);
}

答案 1 :(得分:1)

如果遇到问题,主要是因为解决方案过于复杂。无需使用指针数组。

相反,只需将屏幕存储为字符串数组,然后使用std::getline从文件中读取它们:

std::array<std::string, 3> read_file(std::istream& s) {
    std::array<std::string, 3> result;
    for (auto & row : result)
        std::getline(s, row);
    return result;
}

您也将变量定义称为“文件”;这是不一样的。通常,文件驻留在磁盘上。上面的解决方案足够灵活(感谢std::istream接口),可以接受基于内存的std::stringstream(例如在我的示例中)或例如std::ifstream("your_path.txt")

如果您最初打算将所有内容存储在源代码中,那么将所有内容都以需要使用的形式存储起来似乎是一个更好的选择。

Working example