从文件C ++加载信息

时间:2016-11-22 12:31:49

标签: c++ file variables login

我有一个程序可以将文件中的信息加载到播放器类变量中。一切正常,除了最后一个变量playerdamage ..

<apex:page sidebar="false" showheader="false">
	
    <head>

     
    <style type="text/css">
    html { height: 100% }
    body { height: 100%; margin: 0; padding: 0 }
    #map-canvas { width:100%;height:80%; }
    .controls      
    </style>
    

    <script src="https://maps.googleapis.com/maps/api/js?key=XXXXXX"></script>


    <script>


    var myCenter = new google.maps.LatLng(51.508742, -0.120850);
    var circle;

    function initialize() {
    var mapProp = {
        center: myCenter,
        zoom: 15,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("googleMap"), mapProp);
    var marker = new google.maps.Marker({
        position: myCenter,
    });
    
    circle = new google.maps.Circle({
        map: map,
        radius: 100,    // 10 miles in metres
        fillColor: '#AA0000',
        center: myCenter
     });               
    marker.setMap(map);    

    }

    function updateRadius(){
    var rad = document.getElementById("value_rad").value;
    circle.setRadius(parseFloat(rad));
    }
    

    google.maps.event.addDomListener(window, 'load', initialize);
    console.log()

    </script>
    </head>
    <body>
  
    <div id="googleMap" style="width:100%;height:80%;"></div>
    <input id="value_rad" />
    <input id="radius" type="button" value="Search" onclick="updateRadius()"/>
    </body>
    </apex:page>

以下是文件内容(其中playerdamage是最后一个):

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

但如果我登录并输入'stats':

enter image description here

除了损坏外,它们都正确加载。

2 个答案:

答案 0 :(得分:3)

问题是你要用&#39;&#39;分隔值?其中&gt;&gt;运算符处理文件中的连续字符,并且不知道分号是您的分隔符。

解决问题的最简单,最快捷的方法是在每次调用后跳过文件中的单个字符。所以你会得到这样的代码:

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

这样所有的转换仍然由流本身处理 - 这对开发人员来说是好的,少编码。

另一种方法需要更多工作。基本上根据文档ifstream运算符&gt;&gt;按照(简称)

的方式工作
  

从流中依次提取和解析字符   将它们解释为正确类型值的表示,   它存储为val的值。

示例中的变量属于未知类型,如果它们使用您自己的类型指定,那么您可能会重载ifstream 运算符&gt;&gt;

答案 1 :(得分:1)

如果只使用get line,会出现什么?

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

如果你想在getline调用后转换你的数据的整数或双值:

将字符串转换为int:

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

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

将字符串转换为double:

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

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

所以你得到这样的东西:

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