解析 CString 中的信息
Parsing information in a CString
我在解析 cstring 中的信息时无法正确使用算法。
我有一个与此类似的数据文件。
Hammer 1 1.00
Drill 2 2.00
Saw 3 3.00
Level 4 4.00
Pick 5 5.00
Nail 6 6.00
Mallet 7 7.00
Putty 8 8.00
Stapler 9 9.00
Desk 10 10.00
Table 11 11.00
Marker 12 12.00
数据文件可以有 spaces 来开始每行或每个值之间。
此数据文件的格式为名称、数量和价格。正确解析后,每个名称、数量和价格都存储在一个结构数组中。
我需要在这个问题上使用 cstrings,因为我现在正在从一本书中学习它们。
到目前为止,这是我的算法,我想我陷入了 while 循环的某个地方,我的程序刚刚挂起。
对于我的代码,我的想法是这样的。虽然来自数据文件的行的 readLineIndex
处的值不是空字符,但在内部执行。如果 cstring 在 cstring 中的任何地方有一个空行,则将一个空行添加到我的 readLineIndex
,如果该字符是字母数字,则将其复制到一个临时数组中并移动到下一个字符并重复上述操作,直到您得到一个空白 [=32] =].一旦程序遇到空白 space,将该值存储到正确的结构变量数组中。程序会通过计数知道它的值是多少,因为我从输入文件中得到的只有 3 个变量我只想说如果我检索的第一个变量在我的计数器上是 1 然后将它存储到 array[structureCounter].product , 如果是 2 存储到 array[structureCounter].quantity, 如果是 3 存储到 array[structureCounter].unitPrice.此外,每次解析完成且文件读取不在行尾时,structureCounter 只会加一。
这就是我的函数被调用的方式。 MAX_INVENTORY = 12.
while(!inFile.getline(readLine, MAX_CHARACTERS, '\n').eof() && structureCounter < MAX_INVENTORY)
{
parseInformation(readLine,inventory, readLineIndex, structureCounter);
structureCounter += 1;
}
函数算法。
void parseInformation(OneLine readLine,OneItem inventory[], int & readLineIndex, int & structureCounter)
{
int tempIndex = 0;
int valueCounter = 0;
OneLine tempArray;
while(readLine[readLineIndex] != '[=12=]')
{
while(readLine[readLineIndex] == ' ')
{
readLineIndex += 1;
}
while(isalnum(readLine[readLineIndex]))
{
tempArray[tempIndex] = readLine[readLineIndex];
tempIndex += 1;
readLineIndex += 1;
}
if(valueCounter == 0)
{
strcpy(inventory[structureCounter].product,tempArray);
valueCounter += 1;
}
if(valueCounter == 1)
{
inventory[structureCounter].quantity = atoi(tempArray);
valueCounter += 1;
}
if (valueCounter == 2)
{
inventory[structureCounter].unitPrice = atof(tempArray);
}
}
return;
首先,在调用 strcpy
之前,您没有向 tempArray
添加空终止符。其次,在您复制 tempArray
后,您需要将 tempIndex
重置回 0
以便您可以将其用于下一个字段。第三,从 tempArray
复制到 product
后,您将 valueCounter
从 0
递增到 1
。所以下一个测试 if (valueCounter == 1)
会成功,它会尝试将解析后的 tempArray
放入 quantity
;然后你将它增加到2
,下一个测试会成功,你会尝试把它变成unitPrice
。您应该使用 else if
或 switch
语句,以便您只执行其中一个;您还可以在完成所有测试后valueCounter
增加。
void parseInformation(OneLine readLine,OneItem inventory[], int & readLineIndex, int & structureCounter) {
int tempIndex = 0;
int valueCounter = 0;
OneLine tempArray;
while(readLine[readLineIndex] != '[=10=]') {
while(readLine[readLineIndex] == ' ') {
readLineIndex += 1;
}
while(isalnum(readLine[readLineIndex])) {
tempArray[tempIndex] = readLine[readLineIndex];
tempIndex += 1;
readLineIndex += 1;
}
tempArray[tempIndex] = 0; // Add null terminator
switch (valueCounter) {
case 0:
strcpy(inventory[structureCounter].product,tempArray);
break;
case 1:
inventory[structureCounter].quantity = atoi(tempArray);
break;
case 2:
inventory[structureCounter].unitPrice = atof(tempArray);
break;
}
valueCounter++;
}
return;
}
我在解析 cstring 中的信息时无法正确使用算法。
我有一个与此类似的数据文件。
Hammer 1 1.00
Drill 2 2.00
Saw 3 3.00
Level 4 4.00
Pick 5 5.00
Nail 6 6.00
Mallet 7 7.00
Putty 8 8.00
Stapler 9 9.00
Desk 10 10.00
Table 11 11.00
Marker 12 12.00
数据文件可以有 spaces 来开始每行或每个值之间。 此数据文件的格式为名称、数量和价格。正确解析后,每个名称、数量和价格都存储在一个结构数组中。
我需要在这个问题上使用 cstrings,因为我现在正在从一本书中学习它们。
到目前为止,这是我的算法,我想我陷入了 while 循环的某个地方,我的程序刚刚挂起。
对于我的代码,我的想法是这样的。虽然来自数据文件的行的 readLineIndex
处的值不是空字符,但在内部执行。如果 cstring 在 cstring 中的任何地方有一个空行,则将一个空行添加到我的 readLineIndex
,如果该字符是字母数字,则将其复制到一个临时数组中并移动到下一个字符并重复上述操作,直到您得到一个空白 [=32] =].一旦程序遇到空白 space,将该值存储到正确的结构变量数组中。程序会通过计数知道它的值是多少,因为我从输入文件中得到的只有 3 个变量我只想说如果我检索的第一个变量在我的计数器上是 1 然后将它存储到 array[structureCounter].product , 如果是 2 存储到 array[structureCounter].quantity, 如果是 3 存储到 array[structureCounter].unitPrice.此外,每次解析完成且文件读取不在行尾时,structureCounter 只会加一。
这就是我的函数被调用的方式。 MAX_INVENTORY = 12.
while(!inFile.getline(readLine, MAX_CHARACTERS, '\n').eof() && structureCounter < MAX_INVENTORY)
{
parseInformation(readLine,inventory, readLineIndex, structureCounter);
structureCounter += 1;
}
函数算法。
void parseInformation(OneLine readLine,OneItem inventory[], int & readLineIndex, int & structureCounter)
{
int tempIndex = 0;
int valueCounter = 0;
OneLine tempArray;
while(readLine[readLineIndex] != '[=12=]')
{
while(readLine[readLineIndex] == ' ')
{
readLineIndex += 1;
}
while(isalnum(readLine[readLineIndex]))
{
tempArray[tempIndex] = readLine[readLineIndex];
tempIndex += 1;
readLineIndex += 1;
}
if(valueCounter == 0)
{
strcpy(inventory[structureCounter].product,tempArray);
valueCounter += 1;
}
if(valueCounter == 1)
{
inventory[structureCounter].quantity = atoi(tempArray);
valueCounter += 1;
}
if (valueCounter == 2)
{
inventory[structureCounter].unitPrice = atof(tempArray);
}
}
return;
首先,在调用 strcpy
之前,您没有向 tempArray
添加空终止符。其次,在您复制 tempArray
后,您需要将 tempIndex
重置回 0
以便您可以将其用于下一个字段。第三,从 tempArray
复制到 product
后,您将 valueCounter
从 0
递增到 1
。所以下一个测试 if (valueCounter == 1)
会成功,它会尝试将解析后的 tempArray
放入 quantity
;然后你将它增加到2
,下一个测试会成功,你会尝试把它变成unitPrice
。您应该使用 else if
或 switch
语句,以便您只执行其中一个;您还可以在完成所有测试后valueCounter
增加。
void parseInformation(OneLine readLine,OneItem inventory[], int & readLineIndex, int & structureCounter) {
int tempIndex = 0;
int valueCounter = 0;
OneLine tempArray;
while(readLine[readLineIndex] != '[=10=]') {
while(readLine[readLineIndex] == ' ') {
readLineIndex += 1;
}
while(isalnum(readLine[readLineIndex])) {
tempArray[tempIndex] = readLine[readLineIndex];
tempIndex += 1;
readLineIndex += 1;
}
tempArray[tempIndex] = 0; // Add null terminator
switch (valueCounter) {
case 0:
strcpy(inventory[structureCounter].product,tempArray);
break;
case 1:
inventory[structureCounter].quantity = atoi(tempArray);
break;
case 2:
inventory[structureCounter].unitPrice = atof(tempArray);
break;
}
valueCounter++;
}
return;
}