使用stringstream解析字符串到指针数组时的分段错误错误

时间:2015-01-26 18:09:41

标签: c++ arrays pointers getline stringstream

我正在逐行读取一个文本文件,其内容用逗号分隔,并通过使用getline()解压缩到我的stringColor,stringName,stringReward变量,传递到我的stringstream ss,然后传递给我的tileArray指针数组分别为int,string和int变量。

我的程序编译,但是当我运行它时,它会生成一个Segmentation Fault 11,看起来就是我将行内容传递给stringstream的地方。我无法找到问题所在......

也许如果有人能够指出错误的位置,我将非常感激。

这是我尝试从文本文件中读取的每一行的格式。 它应该能够读取任意数量的行。

0,瓦片1,5
4,瓷砖2,5
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 个答案:

答案 0 :(得分:0)

我会简化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;