вывод из файла, застрявшего в цикле и не читающего?

0

Таким образом, цикл while в нижней части этого следующего кода просто просто циклы непрерывно, я работал, прежде чем добавить строку

questionFile >> answersArray[i];

Кажется, что эта строка нарушает его, так что ничего больше не записывается в questionsArray, я довольно тупик от этого, поэтому нам будет по достоинству оценена помощь.

ifstream questionFile;
int i = 0;
switch (x){
case 1:
    questionFile.open("Topic1 Questions.txt", ios::app);
    break;
case 2:
    questionFile.open("Topic2 Questions.txt", ios::app);
    break;
case 3:
    questionFile.open("Topic3 Questions.txt", ios::app);
    break;
case 4:
    questionFile.open("Topic4 Questions.txt", ios::app);
    break;
}
if (!questionFile)
{
    cout << "Cannot load file" << endl;
}
else
{
    if (questionFile.peek() != ifstream::traits_type::eof()) {
        while (!questionFile.eof())
        {
            getline(questionFile, questionsArray[i]);
            questionFile >> answersArray[i];
            i++;
        }
    }
    questionFile.close();
}
  • 0
    Попробуйте while (getline(questionFile, questionsArray[i]))
  • 0
    Нету не работает, оставил меня с пустым окном консоли вместо
Теги:
file
loops

2 ответа

1

Оба getline и operator>> извлекают из файла, но getline читает до '\n' (или любого символа, который вы указываете), пока operator>> читает до пробела. Кроме того, operator>> оставит "\n" в потоке, вызывает следующий вызов getline чтобы ничего не читать.

Прочтите документацию getline и operator>> для получения более подробной информации (это ссылки).

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

Надеюсь, это поможет.

  • 0
    Вопросы - это строка из нескольких строк с пробелами, а ответы - просто целые, я не думал добавлять это извинения за это, я также до сих пор не могу найти способ исправить это, так что любая помощь будет отличной.
  • 0
    Я забыл ответить на это, вам все еще нужна помощь?
Показать ещё 1 комментарий
0

Это немного сложно (хорошо, невозможно, действительно), чтобы быть уверенным в вашей проблеме, не видя таких вещей, как тип answersArray. Это также поможет (много) увидеть, какой образец входного файла вы хотите прочитать.

На данный момент я предполагаю, что ваш файл ввода выглядит примерно так:

1) air 2) earth 3) fire 4) water
3
1) Solid 2) Liquid 3) Gas 4) Plasma
2

т.е. одна строка представляет собой строку (содержащую вопросы или возможные ответы, или, возможно, и то, и другое), а следующая строка - это одно число, означающее правильный ответ (или что-то в этом порядке).

Предполагая, что в этом случае я прочитал бы все данные из самого входного файла, используя std::getline. Тогда я разделил бы это на нужные части.

Я бы, вероятно, также создал класс answer (или что-то подобное) для хранения как строки, так и числа, а также operator>> перегрузки operator>> для этого класса для чтения обоих.

struct answer { 
    std::string question;
    int answer;

    friend std::istream &operator>>(std::istream &is, answer &a) { 
        std::getline(is, a.question);
        std::string temp;
        std::getline(is, temp);
        a.answer = boost::lexical_cast<int>(temp);
        return is;
    }
};

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

std::vector<answer> answers{
    std::istream_iterator<question>(questionFile),
    std::istream_iterator<question>()};

Это считывает данные из файла и помещает элементы, которые он считывает, в вектор, который я назвал answers.

Пока мы это делаем, я также изменил бы код, чтобы открыть файл, по крайней мере, немного. ios::app действительно имеет смысл, если вы собираетесь писать в файл, а не просто читать. Во-вторых, аргумент case для выбора жестко закодированных имен файлов кажется немного неуклюжим, по крайней мере для меня.

Вероятно, я бы написал, что часть кода выглядит примерно так:

if (x<0 || x > 4)
    throw std::runtime_error("prohibited file name");

std::stringstream name << "Topic" << x << " Questions.txt";
std::ifstream questionFile(name.str());
  • 0
    Я немного потрясен тем, как много вы написали, но я все еще немного застрял в этом, однако, answersArray заполнен целочисленными значениями и questionsArray заполнен группой строк с пробелами, любой простой ответ был бы очень признателен, так как я ничего не понимаю В настоящее время

Ещё вопросы

Сообщество Overcoder
Наверх
Меню