Чтение текстового файла в значения C ++, разделенные разными символами - PullRequest
0 голосов
/ 09 марта 2012

У меня есть текстовый файл с некоторыми данными, и я пытаюсь прочитать его в свои объекты.

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

StringFileName
IntWidth IntHeight
IntA:IntB IntA:IntB IntA:IntB
IntA:IntB IntA:IntB IntA:IntB
IntA:IntB IntA:IntB IntA:IntB

Например:

MyFile.txt
3 3
1:2 3:4 4:5
9:2 1:5 2:1
1:5 8:3 4:2
There may be more unrelated text here

Вот что у меня есть:

void OnLoad(char* InputFilename) {
    string Filename;
    int Width;
    int Height;

    // open the file
    ifstream inputFile(InputFilename);

    // get the filename
    getline(inputFile, Filename);
    cout << "Filename is " << Filename << endl;

    // get the width and height
    string dataLine;
    getline(inputFile, dataLine);
    stringstream ss(dataLine);
    ss >> Width;
    ss >> Height;
    cout << "Dimensions are " << Width << "x" << Height << endl;

    // get the lines of tile-data
    for (int Y = 0; Y < Height; Y++) {
        /*
         * Here is where I'm getting stuck.
         * I have a string of "i:i i:i i:i" values, and I get a series of strings 
         * of "i:i" values, but can't work out the neatest way of splitting it out.
         */
        getline(inputFile, dataLine);
        stringstream row(dataLine);
        for (int X = 0; X < Width; X++) {
            int IntA;
            int IntB;
            // ?
            DoStuffWith(IntA, IntB);
        }

   }
}

Ответы [ 4 ]

2 голосов
/ 09 марта 2012

Функция разделения Boost может делить произвольное количество предикатов. Так что вы можете сделать что-то вроде:

vector<string> results;
boost::split( results, data_string, boost::is_any_of(" :") ); <- splits on spaces and ":"

Тогда у вас есть все данные в удобном контейнере!

Возможно, не лучшее решение в вашем случае, но это хорошо иметь в виду.

2 голосов
/ 09 марта 2012

Как то так должно работать

std::ifstream file("filename");
std::string file_name;
int height, width;
file >> file_name >> height >> width;
// i don't know what your format is but it isn't very importance
std::deque<std::pair<int, int> > pairs;
std::string line;
int i, j;
char a;
while(std::cin >> i >> a >> j)  //here i j are values in your pair.
{
     if(a!=':') break;
     pairs.push_back(std::make_pair(i, j));
}
0 голосов
/ 09 марта 2012

Теперь вы можете использовать «* i» и назначить значения int, которые вы получите, более понятным способом.

std::string line;
            do{
                getline(inputFile,line);
                sregex_token_iterator end;

                for(sregex_token_iterator i(line.begin(), line.end(), pattern,-1); i!=end;++i)
                {
                    cout<< *i << " " ;
                }
            }while(!inputFile.eof());
0 голосов
/ 09 марта 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...