2016-11-22 3 views
0

У меня есть программа, которая загружает информацию из файла в переменные класса игрока. Все работает отлично, за последний переменной playerdamage кроме ..Загрузка информации из файла C++

void Player::loadplayer(std::string name) 
{ 
    std::ifstream UserFile; 
    UserFile.open(name + ".txt"); 

    if (UserFile.is_open()) 
    { 
     while (UserFile.good()) 
     { 
      getline(UserFile, playername, ';'); 
      getline(UserFile, playerpass, ';'); 
      UserFile >> playercash; 
      UserFile >> playercoords; 
      UserFile >> playerdamage; 
     } 
    } 
    UserFile.close(); 
} 

Вот содержимое файла (с playerdamage быть последним):

Allura;Password123;5.00;0.0;10.00 

Но если бы я войти и типа «Статистика»:

enter image description here

Это все нагрузки правильно за ущерб, за исключением.

ответ

1

Что добавляется, если вы используете только линию?

 getline(UserFile, playername, ';'); 
     getline(UserFile, playerpass, ';'); 
     getline(UserFile, playercash, ';'); 
     getline(UserFile, playercoords, ';'); 
     getline(UserFile, playerdamage); 

, если вы хотите, целое число или двойное значение преобразовать данные после GetLine вызова:

Чтобы преобразовать строку в целое:

atoi(str.c_str()) // C++ 98 

std::stoi(str) // C++ 11 

Для преобразования строки в два раза:

atof(str.c_str()) // C++ 98 

std::stod(str) // C++ 11 

, так что вы получите что-то вроде этого:

 string playercoordsString; 
     getline(UserFile, playercoordsString, ';'); 
     playercoords = std::stod(playercoordsString); 
+0

Видимо, GetLine не работает для Интс или двойники. Это сделало бы жизнь намного легче, если бы это произошло! –

+0

См. Мое редактирование, просто конвертируйте строку после получения – baddger964

+0

Спасибо, что это работает! XD –

3

Проблема в том, что вы разделяете значения с помощью символа ';' где оператор >> работает с последовательными символами из файла и не знает, что точка с запятой является вашим делителем.

Самый простой и быстрый способ устранить проблему - пропустить один символ из файла после каждого вызова. Таким образом, вы получите код, как это:

UserFile >> playercash; 
UserFile.ignore(1); 
UserFile >> playercoords; 
UserFile.ignore(1); 
UserFile >> playerdamage; 

Таким образом, все преобразования по-прежнему обрабатываются сам поток - это хорошо, меньше кодирования для разработчика.

Другой подход потребует дополнительной работы. В основном в соответствии с Документами оператора ifstream >> работает, как описано (короче)

Экстракты и обрабатывает символы последовательно из потока, чтобы интерпретировать их как представление значения соответствующего типа, , который хранится в виде значение val.

Переменные в ваших примерах неизвестного типа, если они где указаны с вашим собственным типом, то вы можете перегрузить оператор ifstream >>

Смежные вопросы