1

首先是我的代码:

int GetHighScore(string name)
{
    int highScore = 0;
    ifstream fin;
    char textInFile[50];1

    fin.open(name + ".txt", ios::in);

    if (fin.fail())
    {
        // Old piece of code
        highScore = 0;
    }
    else
    {
        while (fin.good())
        {
            fin >> textInFile;
            for each (char var in textInFile)
            {
                if (var == '#')
                {
                    char c = fin.peek();

                    if (c == '1')
                    {
                        char score = fin.peek();
                        highScoreLvl1 = (int)score;
                    }
                    else if (c == '2')
                    {
                        char score = fin.peek();
                        highScoreLvl2 = (int)score;
                    }
                    else if (c == '3')
                    {
                        char score = fin.peek();
                        highScoreLvl3 = (int)score;
                    }
                }
            }
        }
        //fin >> highScore;
    }


    // Return the high score found in the file
    return highScoreLvl1;
}

它检测到“#”,然后在执行 peek 操作时c被赋值。'ÿ'它应该给出的是数字'1''2''3'(以字符形式);但它不是出于某种原因,我不明白为什么......:/

文件如下所示:

level#12level#22level#32

第一个数字代表级别,第二个数字是在该级别上取得的分数。

4

1 回答 1

1

如果您的文件包含唯一的字符串 'level#12level#22level#32',那么它将被读入fin >> textInFile操作符中的 textInFile。当您在字符串中遇到 '#' 字符时,您试图从文件流中窥视字符但没有什么可窥视的,这就是返回 -1(文件结尾)的原因。

要解决此问题,您需要从 textInFile 字符串中获取下一个字符,而不是从文件中获取。这是示例代码:

int GetHighScore(string name)
{
    int highScore = 0;
    ifstream fin;
    char textInFile[50];

    fin.open(name + ".txt", ios::in);

    int highScoreLvl1, highScoreLvl2, highScoreLvl3;

    if (fin.fail())
    {
        // Old piece of code
        highScore = 0;
    }
    else
    {
        while (fin.good())
        {
            fin >> textInFile;
            bool bPrevIsHash = false;
            size_t nLength = strlen(textInFile);
            for (size_t i = 0; i + 2 < nLength; ++i)
            {
                if (textInFile[i] == '#')
                {
                    if (textInFile[i + 1] == '1')
                    {
                        highScoreLvl1 = (int)textInFile[i + 2];
                    }
                    else if (textInFile[i + 1] == '2')
                    {
                        highScoreLvl2 = (int)textInFile[i + 2];
                    }
                    else if (textInFile[i + 1] == '3')
                    {
                        highScoreLvl3 = (int)textInFile[i + 2];
                    }
                }
            }
        }
    }


    // Return the high score found in the file
    return highScoreLvl1;
}

您的代码还有其他几个问题:

  1. 您返回的 highScoreLvl1 的值可能未初始化,因为字符串中不能有 '#'。并且可能您的意思是返回 highScoreLvl1、highScoreLvl2 或 highScoreLvl3 的最大值。
  2. 您正在分配转换为 int 的 char 值。在这种情况下,您将不会获得 1、2 等的值。您将获得 ASCII 字符的序数,例如 '1' 为 0x31 (49),2 为 0x32 (50) 等。如果您需要数字值,您可以做以下技巧:highScoreLvl1 = textInFile[i + 2] - '0';
于 2016-03-26T17:04:42.833 回答