Raised This Month: $51 Target: $400
 12% 

Problème avec écriture de fichier


  
 
 
Thread Tools Display Modes
Author Message
Kidev
Veteran Member
Join Date: Jun 2010
Location: France
Old 12-10-2011 , 10:47   Problème avec écriture de fichier
#1

Salut!
Alors voilà, j'aimerai sauvegarder des infos dans un fichier et les récupérer. Les récupérer, c'est bon (étrangement) alors qu’enregistrer, ça marche, mais ça donne des trucs comme ça:
Code:
"STEAM_0:1:25648437" "0" "~iG`Rakuraii [Co]-[L]dr ^^"                                  
"STEAM_0:1:25648437" "0" "~iG`Rakuraii [Co]-[L]dr ^^"                                  
" "Kid"                                  
      
"STEAM_0:1:38423710" "0" "sMOKY* #LE"                                  
"STEAM_0:1:38423710" "0" "sMOKY* #LE"                                  
0:0:22492608" "0" "Kid"                                  
     
"STEAM_0:1:36850164" "0" ".~#SAW#~. Showw [ElectrO]"                                  
"STEAM_0:1:36850164" "0" ".~#SAW#~. Showw [ElectrO]"                                  
6" "0" "Pouette"                                  
"STEAM_0:0:22492608" "0" "Kid"                                  
"STEAM_0:0:22492608" "0" "Kid"                                  
     
"" "0" "e2k - Drinker"                                  
"STEAM_0:0:20505546" "0" "Pouette"                                  
"STEAM_0:0:20505546" "0" "RaVeN"
Les information sont correctement enregistrée, mais il y a plusieurs STEAM_ID pour un seul joueur alors que rien ne change. Mon problème est que je ne trouve pas de méthode pour remplacer une ligne...

Voici mes fonctions:
PHP Code:
public bb_set_user_levelidexpstartlevel )
{
    new 
n;
    if( 
is_user_connectedid ) )
    {
        while ( 
exp > ( ( ) * 10 ) )
        {
            
n++;
        }
    }
    
iLevelid ] = 1;
    
client_print0print_chat"bb_set_user_level : level returned: %i"iLevelid ] );
    return ( 
startlevel == iLevelid ] ? );
}

public 
betaUpdateid )
{
    
updateExpidiExpid ] );
}

public 
betaGetid )
{
    
getUserExpid );
}

public 
betaGetLevelid )
{
    
bb_set_user_levelidiExpid ], iLevelid ] );
}

public 
getUserExpid )
{
    new 
iSteamId35 ];
    new 
xpfound;
    
get_user_authididiSteamIdcharsmaxiSteamId ) );

    new 
fp fopenszLevelsFile"rt" );
    if ( !
fp )
    {
        return -
1;
    }

    new 
szLineData364 ], szLineKey96 ], szLineValue264 ], szName35 ];
    while ( !
feoffp ) )
    {
        
fgetsfpszLineDatacharsmaxszLineData ) );
        
trimszLineData );

        if ( 
szLineData] == ';' || szLineData] == '#' || ( szLineData] == '/' && szLineData] == '/' ) || !szLineData] )
        {
            continue;
        }

        
parseszLineDataszLineKeycharsmaxszLineKey ), szLineValuecharsmaxszLineValue ), szNamecharsmaxszName ) );
        
remove_quotesszLineKey );
        
remove_quotesszLineValue );
        
remove_quotesszName );

        if ( 
equalszLineKeyiSteamId ) )
        {
            
client_print0print_chat"getUserExp: %s %s has %s xp"szLineKeyszNameszLineValue );
            
xp str_to_numszLineValue );
            
found 1;
            break;
        }
    }
    
fclosefp );
    if ( !
found )
    {
        
client_print0print_chat"getUserExp: NOT FOUND! %s. Launch updateExp"iSteamId );
        
xp 0;
        
updateExpidxp );
    }
    return 
xp;
}

public 
updateExpidxp )
{
    new 
iSteamId35 ], iName35 ];
    new 
done = -1;

    
get_user_authididiSteamIdcharsmaxiSteamId ) );
    
get_user_nameidiNamecharsmaxiName ) );

    new 
fp fopenszLevelsFile"r+wt" );
    if ( !
fp )
    {
        return 
done;
    }

    
done 0;

    new 
szLineData364 ], szLineKey96 ], szLineValue264 ], szName35 ];
    while ( !
feoffp ) )
    {
        
fgetsfpszLineDatacharsmaxszLineData ) );
        
trimszLineData );

        if ( 
szLineData] == ';' || szLineData] == '#' || ( szLineData] == '/' && szLineData] == '/' ) || !szLineData] )
        {
            continue;
        }

        
parseszLineDataszLineKeycharsmaxszLineKey ), szLineValuecharsmaxszLineValue ), szNamecharsmaxszName ) );
        
remove_quotesszLineKey );
        
remove_quotesszLineValue );
        
remove_quotesszName );

        
client_print0print_chat"updateExp: %s %s %s"szLineKeyszLineValueszName );

        if ( 
equalszLineKeyiSteamId ) )
        {
            
fseekfp0SEEK_CUR );
            
fprintffp"^"%s^" ^"%i^" ^"%s^"                                  ^n"iSteamIdxpiName );
            
done 1;
            
client_print0print_chat"updateExp: FOUND! %s = %s. puts %s %i %s"szLineKeyiSteamIdiSteamIdxpiName );
            break;
        }
    }
    if ( !
done )
    {
        
fseekfp0SEEK_END );
        
fprintffp"^"%s^" ^"%i^" ^"%s^"                                  ^n"iSteamIdxpiName );
        
client_print0print_chat"updateExp: NEW! puts %s %i %s"iSteamIdxpiName );
        
done 1;
    }
    
fclosefp );
    return 
done;

PS: Les 3 petites fonction servent à tester.
PS2: J'ai mis beaucoup d'espaces pour empêcher que la réécriture n'écrase pas toute la ligne.

Voilà voilà, j'espère qu'il y a une solution ^^
__________________

Last edited by Kidev; 12-10-2011 at 10:49.
Kidev is offline
cagnois
Senior Member
Join Date: Nov 2010
Old 12-10-2011 , 12:46   Re: Problème avec écriture de fichier
#2

ton plugin a l'air pas mal pour recuperer tous les steam id.
Tu le partagera ou il serra privé?
cagnois is offline
ConnorMcLeod
Veteran Member
Join Date: Jul 2006
Location: France (95)
Old 12-10-2011 , 12:56   Re: Problème avec écriture de fichier
#3

La lecture/écriture de fichier n'est pas des plus adaptées pour lire/sauvegarder des XP/données plusieurs fois au cours de la map, ça peut être jouable si tu charges tout au chargement de la map et que tu sauves tout en fin de map mais sinon il vaut mieux utiliser nvault (ne permet que de sauver un string, mais on peut facilement s'en accomoder dans ton cas) ou sql.
__________________
- tired and retired -

- my plugins -
ConnorMcLeod is offline
Kidev
Veteran Member
Join Date: Jun 2010
Location: France
Old 12-10-2011 , 13:29   Re: Problème avec écriture de fichier
#4

Quote:
Originally Posted by ConnorMcLeod View Post
La lecture/écriture de fichier n'est pas des plus adaptées pour lire/sauvegarder des XP/données plusieurs fois au cours de la map, ça peut être jouable si tu charges tout au chargement de la map et que tu sauves tout en fin de map mais sinon il vaut mieux utiliser nvault (ne permet que de sauver un string, mais on peut facilement s'en accomoder dans ton cas) ou sql.
Oui je pensais à ça aussi. Mais j'ai changé d'avis pour plusieurs raisons:
1) Je maîtrise nVault et j'avais envie d'essayer ce type de truc
2) Je ne vois vraiment pas comment faire de classement avec nVault (y'a SQL, mais j'ai pas trop envie d'essayer en fait)
3) On peut facilement éditer le fichier.

Pour info ces fonction sont appelées à la connexion et à la déconnexion d'un joueur.
__________________

Last edited by Kidev; 12-10-2011 at 13:29.
Kidev is offline
ConnorMcLeod
Veteran Member
Join Date: Jul 2006
Location: France (95)
Old 12-10-2011 , 14:30   Re: Problème avec écriture de fichier
#5

Quote:
Originally Posted by -Kid- View Post
3) On peut facilement éditer le fichier.
La preuve que non, pour écraser une ligne tu dois écrire un fichier temporaire, puis effacer l'ancien fichier et renommer le fichier temporaire.
Tu peux aussi, une fois la ligne à remplacer identifiée, fermer le fichier et utiliser write_file qui fera ce que je viens de décrire mais de façon interne.
Attention les n° de lignes commencent à 0.
__________________
- tired and retired -

- my plugins -
ConnorMcLeod is offline
Arkshine
AMX Mod X Plugin Approver
Join Date: Oct 2005
Old 12-10-2011 , 14:34   Re: Problème avec écriture de fichier
#6

Tu devrais regarder dans les .inc dispos, certains qui te faciliterait la vie : https://forums.alliedmods.net/showth...t=172936#Vault
__________________
Arkshine is offline
Kidev
Veteran Member
Join Date: Jun 2010
Location: France
Old 12-10-2011 , 14:56   Re: Problème avec écriture de fichier
#7

Quote:
Originally Posted by ConnorMcLeod View Post
La preuve que non, pour écraser une ligne tu dois écrire un fichier temporaire, puis effacer l'ancien fichier et renommer le fichier temporaire.
Tu peux aussi, une fois la ligne à remplacer identifiée, fermer le fichier et utiliser write_file qui fera ce que je viens de décrire mais de façon interne.
Attention les n° de lignes commencent à 0.
Je voulais dire éditer manuellement ^^

Quote:
Originally Posted by Arkshine View Post
Tu devrais regarder dans les .inc dispos, certains qui te faciliterait la vie : https://forums.alliedmods.net/showth...t=172936#Vault
Ok merci je vais voir.
__________________
Kidev is offline
PsYChOPaTiQuE
Veteran Member
Join Date: Jan 2009
Location: Paris
Old 12-10-2011 , 17:23   Re: Problème avec écriture de fichier
#8

Quote:
Originally Posted by cagnois View Post
ton plugin a l'air pas mal pour recuperer tous les steam id.
Tu le partagera ou il serra privé?

pour les steamID tu peux toujours utiliser les psychostats
__________________
PsYChOPaTiQuE is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 00:55.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode