Ошибка ошибки сегментации при разборе строки на массив указателей с помощью 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;