解析 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 后,您将 valueCounter0 递增到 1。所以下一个测试 if (valueCounter == 1) 会成功,它会尝试将解析后的 tempArray 放入 quantity;然后你将它增加到2,下一个测试会成功,你会尝试把它变成unitPrice。您应该使用 else ifswitch 语句,以便您只执行其中一个;您还可以在完成所有测试后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;
}