Как заполнить массив указателей из текстового файла? - PullRequest
0 голосов
/ 14 января 2019

Я работаю над школьным проектом, который должен быть сегодня, и застрял на, вероятно, простой проблеме.

Мне нужно сделать игру "Палач", и задача, на которой я застрял, - заполнить массив указателей из текстового файла (мне нужно прочитать картинки для неправильных ответов).

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

И мой текстовый файл выглядит так:

char *scene1 =
    "                      \n"
    "                      \n"
    "                      \n"
    "                      \n"
    "                      \n"
    "                      \n"
    "       *              \n"
    "      * *             \n"
    "     *   *            \n";


char *scene2 =
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "       *              \n"
    "      * *             \n"
    "     *   *            \n";

и т. Д.

Код в методе работал для чтения паролей, потому что они были разделены пробелами. Итак, у меня есть 10 сцен, и я хочу сохранить их в массиве.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Если вы застряли, это в основном потому, что вы слишком усложнили решение. Нет необходимости использовать массив указателей.

Вместо этого просто сохраните ваш экран в виде массива строк и используйте 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").

Если вы изначально намеревались хранить все в исходном коде, просто сохранение всего в той форме, в которой оно должно использоваться, звучит как лучший вариант.

Рабочий пример .

0 голосов
/ 14 января 2019

Одна проблема в том, что вы думаете, что файлы, которые вы читаете, должны быть 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.


Если вам нужно использовать внешние текстовые файлы без какого-либо кода C ++, то на самом деле это очень просто: просто сохраняйте текст без кавычек или чего-либо, напоминающего объявления или операторы C ++.

Поскольку вы знаете, что каждая "сцена" состоит ровно из девяти строк (и, возможно, дополнительной строки для разделения двух сцен), вы используете цикл 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...