getline не работает с fstream

Я пытаюсь использовать текстовый файл для инициализации структуры, которая будет использоваться для инициализации 2-мерного вектора, да, я знаю, что это сложно, но в конечном итоге будет много данных для работы. Проблема в getline, я отлично использовал его в другом коде, но по какой-то причине он отказывается здесь работать. Я продолжаю получать ошибку аргумента и ошибку шаблона. Будем очень признательны за любые подсказки.

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

using namespace std;

const int HORIZROOMS=10;
const int VERTROOMS=10;
const int MAXDESCRIPTIONS=20;
const int MAXEXITS=6;

struct theme
{
    string descriptions[MAXDESCRIPTIONS];
    string exits[MAXEXITS];
};

void getTheme();

int _tmain(int argc, _TCHAR* argv[])
{
    getTheme();
    vector<vector <room>> rooms(HORIZROOMS, vector<room>(VERTROOMS));
    for (int i=0; i<HORIZROOMS; i++)
    {
        for (int j=0; j<VERTROOMS; j++)
        {
            cout<<i<<" "<<j<<" "<<rooms[i][j].getRoomDescription()<<endl;
        }
    }
    return 0;
}

void getTheme()
{
    theme currentTheme;
    string temp;
    int numDescriptions;
    int numExits;
    ifstream themeFile("zombie.txt");
    getline(themeFile, numDescriptions, ',');
    for (int i=0; i<numDescriptions; i++)
    {
        getline(themeFile, temp, ',');
        currentTheme.descriptions[i]=temp;
    }
    getline(themeFile, numExits, ',');
    for (int i=0; i<numExits; i++)
    {
        getline(themeFile, temp, ',');
        currentTheme.exits[i]=temp;
    }
    themeFile.close();
}

person Modred    schedule 08.02.2013    source источник
comment
Вы можете использовать getline только со строками.   -  person chris    schedule 08.02.2013
comment
могу я предложить что-нибудь вроде tinyXML   -  person aiao    schedule 08.02.2013


Ответы (1)


std::getline используется для извлечения из потока в std::string. Когда вы распаковываете в numDescriptions и numExits, вы действительно хотите operator>>. Например,

themeFile >> numDescriptions;

Это автоматически остановит извлечение в следующем ,. Однако вам нужно будет пропустить эту запятую, если вы не хотите, чтобы она появлялась при следующем std::getline извлечении:

themeFile.ignore();

В качестве альтернативы у вас может быть std::string numDescriptionsString, с которым вы делаете std::getline(themeFile, numDescriptionsString, ','), а затем конвертируете этот std::string в int с помощью std::stoi:

getline(themeFile, numDescriptionsString, ',');
numDescriptions = std::stoi(numDescriptionsString);

Я бы сказал, что это еще более уродливо.

person Joseph Mansfield    schedule 08.02.2013
comment
Отлично, это решило проблему, теперь перейдем к вопросу использования этого для создания моего вектора объектов. Иногда мне жаль, что я все еще не использую Python. - person Modred; 08.02.2013
comment
@Modred Удачи - это не должно быть слишком сложно. Чем больше у вас будет практики, тем лучше вы освоите C ++. Python - тоже отличный язык. В любом случае, если мой ответ помог, не забудьте принять его. Спасибо. - person Joseph Mansfield; 08.02.2013