【问题标题】:segmentation fault error when parsing string to pointer array with stringstream使用字符串流将字符串解析为指针数组时出现分段错误错误
【发布时间】:2015-03-25 05:12:45
【问题描述】:

我正在逐行读取文本文件,其内容用逗号分隔,并通过使用 getline() 提取到我的 stringColor、stringName、stringReward 变量中进行解析,传递到我的 stringstream ss,然后传递给我的 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;
}

【问题讨论】:

  • 指针数组在哪里?你有一个tile 的数组,但我没有看到一个指针数组。顺便说一句,指针数组将是:new tile * [24];
  • 也许您可以使用调试器并告诉我们是哪一行导致了问题。
  • 我建议您删除数组并使用std::vector。你会遇到更少的问题。
  • 生成核心转储并使用 gdb 对其进行分析...几乎不需要几分钟...这样至少可以知道行号。一旦 gdb 处于活动状态,sudo gdb -c "core file" *.exe 后跟 where 命令

标签: c++ arrays pointers getline stringstream


【解决方案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;

【讨论】:

  • 谢谢您,我采纳了您的建议,但它仍然给出分段错误 11 错误...
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2016-06-16
  • 2020-11-27
  • 2017-08-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多