file — взгляд C ++, дающий значение ‘ÿ’ (ifstream)

Мой код в первую очередь:

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;
}

Он обнаруживает «#», но затем c получает назначенное значение 'ÿ' когда он выполняет операцию просмотра. То, что это должно дать, является числом '1', '2' или же '3' (в форме символа); но это не по какой-то причине, и я не могу понять, почему …: /

Вот как выглядит файл:

level#12level#22level#32

Первое число представляет уровень, а второе число представляет собой оценку, достигнутую на этом уровне.

1

Решение

Если ваш файл содержит единственную строку ‘level # 12level # 22level # 32’, тогда он читается в textInFile в fin >> 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. Вы присваиваете значение char, преобразованное в int. В этом случае вы не получите значения 1, 2 и т. Д. Вы получите порядковый номер символа ASCII, например, 0x31 (49) для «1», 0x32 (50) для 2 и т. Д. Если вам нужно цифровое значение, вы можете сделать следующий трюк: highScoreLvl1 = textInFile[i + 2] - '0';
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]