为什么这会导致访问冲突崩溃到0xcccccc ...?

时间:2010-04-08 18:44:34

标签: c++ iostream

我有一段随机的代码,我用来读取CSV文件......这很好......直到大约2000次读取...然后getline行失败,访问违规到0xcccccc ...我假设意味着输入流(文件)已被清除......不是我知道为什么:)

int CCSVManager::ReadCSVLine ( fstream * fsInputFile,
                               vector <string> * recordData )
{
    string s;

    getline ( *fsInputFile, s );
    stringstream iss( s );

    for ( unsigned int i = 0; i < getNumFields (); i++ )
    {
        getline ( iss, s, ',' );
        (*recordData)[i] = s;
    }

    return 0;
}

任何想法为什么?

7 个答案:

答案 0 :(得分:5)

当你像这样的数组一样访问它时,

std::vector不会重新分配自己扩展。你应该做什么而不是

(*recordData)[i] = s;

recordData->push_back(s);

这将根据需要扩展矢量。两种方法之间的一个重要区别是第一种方法总是从向量的第一个元素开始写入。第二个将开始追加到向量的末尾,如果向量最初不为空,则不同。

答案 1 :(得分:3)

你确定recordData有足够的空间来存放所有记录吗?它应该是这样的:

for ( unsigned int i = 0; i < getNumFields() && i < recordData->size() && getline(iss, s, ','); i++ ) 
 { 
  (*recordData)[i] = s; 
 }

答案 2 :(得分:2)

如果(*recordData).size() < getNumFields(),您可能会破坏内存。请考虑取消getNumFields并依赖(*recordData).size()来存储该信息。或者,不要预设矢量的大小,并使用push_back

使用引用也避免使用指针。

int CCSVManager::ReadCSVLine ( fstream &fsInputFile, vector <string> &recordData )
{
 string s;

 getline ( fsInputFile, s );
 istringstream iss( s );

 for ( unsigned int i = 0; i < getNumFields (); i++ )
 {
  getline ( iss, s, ',' );
  recordData.push_back( s );
 }

 return 0;
    }

答案 3 :(得分:1)

在for语句之前进行如下调用,以确保向量具有足够的元素。

recordData->resize(getNumFields ()); 

答案 4 :(得分:0)

是getNum Fields();改变。看起来每次都重新计算。将其移出循环

答案 5 :(得分:0)

我的猜测是getNumFields()返回的数字大于文件中的行数。

该文件包含多少行/记录?

getNumFields()返回什么?

答案 6 :(得分:0)

糟糕... 所有非常好的答案,但它实际上是远,远,更愚蠢的东西。感谢您的回答,我开始寻找代码的一些“其他”部分,我意识到我做错了什么:)(实际上传入的文件是空白的。我没有意识到它是重新打开文件每次重载文件向量......这样一个愚蠢的错误:))

感谢您的回答:)仍然让我的解决方案:)