我以前发布过这个问题,但我似乎找不到解决方案。因此,我再次发布详细的描述,希望能解决这个问题。非常感谢您的帮助。
我想做的是从文本文件中连续读取。此文本文件包含 3 种类型的行:
- 包含单词“start”的行,指示特定测试用例结果的开始
- 包含单词 PASS 或 FAIL 或 PWU 或 FWU 以及随附数据的行
- 包含单词“stop”的行,表示测试用例结果的结束
我遇到的麻烦是dataRowPointer
. dataRowPointer
是一个结构数组。它的指针在主函数中声明,并通过引用传递给下面的函数。
当我调用 时*dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];
,我可以在调试器中看到第一个数组元素 dataRowPointer[0] 已正确分配在内存中。然而,第二个、第三个和所有其他元素没有正确分配,因为调试器在内存中将它们显示为 0xcccccccc。
这影响了我的其他函数调用getDataRow( line, loc, tcsPointer, dataRowPointer );
,其中包含类似于(*dataRowPointer)[dataRowIndex].tcSetNum = testCaseSetID;
.
void getRow( std::istream& myfile, HeaderLocations* loc, TestCaseSet* tcsPointer, DataRow** dataRowPointer )
{
std::string line;
std::string word;
int currentLoc = 0;
bool startStop = true;
std::getline( myfile, line);
std::stringstream sline(line);
while ( sline >> word )
{
if ( word == "PASS" || word == "PWU" || word == "FWU" || word == "FAIL" )
{
startStop = false;
break;
}
else if( word == "start" )
{
dataRowIndex = 0;
*dataRowPointer = new DataRow[MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET];
initializeDataRowPointer( dataRowPointer );
testCaseSetID = captureTestCaseSetNumber( line, tcsPointer );
getHeaderRow( myfile, loc );
startStop = true;
break;
}
else if ( word == "stop" )
{ tcsNumber++;
*dataRowPointer = NULL;
startStop = true;
break;
}
else
{ startStop = false; }
}
if( !startStop )
{
(*dataRowPointer)[dataRowIndex].tcSetNum = testCaseSetID;
getDataRow( line, loc, tcsPointer, dataRowPointer );
dataRowIndex++;
}
}
任何帮助将不胜感激。
注意:我知道我的代码很脆弱(如果文本文档没有开始或停止等),并且包含错误代码(使用全局变量等)。但请我只想在继续之前先解决这个问题。请尝试忽略语句*dataRowPointer = NULL;
中的else if
内容,一旦修复了此错误,我会将其更改为更有用的内容。
编辑按要求提供 struct DataRow 的代码和函数 InitializeDataRowPointer 的代码:
数据行:
struct DataRow
{
std::string tcSetNum;
std::string class_PassFail;
std::string rfPort;
float temp;
float margin;
};
初始化数据行指针:
void initializeDataRowPointer( DataRow** dataRowPointer )
{
DataRow newDataRow = {"a", "a", "a", 0.0, 0.0 };
for ( int i = 0; i < MAX_NUMBER_DATA_ROWS_PER_TEST_CASE_SET; i++ )
{ (*dataRowPointer)[i] = newDataRow; }
}