Ошибка ошибки сегментации при разборе строки на массив указателей с помощью stringstream

Я читаю построчно из текстового файла, содержимое которого разделяется запятыми и анализируется путем извлечения с помощью getline() в мои переменные stringColor, stringName, stringReward, передаются в мой ss stringstream, а затем передаются в мой массив указателей tileArray в соответствующий int переменные типа string и int.

Моя программа компилируется, однако, когда я ее запускаю, она генерирует ошибку сегментации 11 в том месте, где я передаю содержимое строки в stringstream. Я не могу найти, где проблема, однако...

Возможно, если бы кто-то мог указать, где ошибка, я был бы очень благодарен.

Это формат каждой строки, которую я пытаюсь прочитать из текстового файла. Он должен быть в состоянии прочитать любое количество строк.

0, плитка 1,5
4, плитка 2,0
2, плитка 4,1

#include <stdio.h>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct 
{
    int color;
    string name;
    int reward;
}tile;

int main()
{

    string line;

    int numberOfLines = 0;
    ifstream inputFile("inputFile.txt");
    if (inputFile.is_open())
    {
        while(getline(inputFile, line))
        {
            ++numberOfLines; //value to set tile amount
            cout << numberOfLines <<endl;
        }


        tile *tileArray = new tile[numberOfLines]; 
        string stringColor, stringName, stringReward; //declare these values as strings and later convert

        stringstream ss; //stringstream variable to convert string variable

        for(int n = 0; n<(numberOfLines-1); n++)
        {
            getline(inputFile, stringColor, ','); //delimiter at first comma
            cout << stringColor << endl;
            getline(inputFile, stringName, ','); // delimiter at second
            cout << stringName << endl;
            getline(inputFile, stringReward); // stop at the end of the line
            cout << stringReward << endl;

            ss<<stringColor;
            ss>>tileArray[n]->color;
            ss.str("");
            ss.clear();

            cout << tileArray[n]->color;

            ss<<stringName;
            ss>>tileArray[n]->name;
            ss.str("");
            ss.clear();

            cout << tileArray[n]->name;
            ss<<stringReward;
            ss>>tileArray[n]->reward;
            ss.str("");
            ss.clear();

            cout << tileArray[n]->reward;

        }

    }
return 0;
}

1 ответ

Я бы упростил использование stringstream объект. Используя то же самое stringstream Объект как входной поток и выходной поток требует глубокого понимания того, как манипулируют внутренней позицией.

{
   // Create a nested block and a local istringstream in the nested scope
   istringstream ss(stringColor);
   ss >> tileArray[n]->color;
}
cout << tileArray[n]->color;

Так же,

{
   istringstream ss(stringName);
   ss >> tileArray[n]->name;
}
cout << tileArray[n]->name;

а также

{
   istringstream ss(stringReward);
   ss >> tileArray[n]->reward;
}
cout << tileArray[n]->reward;
Другие вопросы по тегам