使用 Stringstream 将字符串解析为指针数组时出现分段错误错误

segmentation fault error when parsing string to pointer array with stringstream

本文关键字:错误 数组 分段 指针 Stringstream 字符串 使用      更新时间:2023-10-16

我正在逐行读取一个文本文件,该文件的内容用逗号分隔,并通过使用 getline() 提取到我的 stringColor、stringName、stringReward 变量中来解析,传递到我的 stringstream ss,然后传递给我的 tileArray 指针数组到各自的 int、string 和 int 变量中。

我的程序编译,但是当我运行它时,它会生成一个分段错误 11,似乎是我将行内容传递到字符串流的地方。但是我找不到问题出在哪里...

也许如果有人能指出错误在哪里,我将不胜感激。

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

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;
}

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