[Tutorial] Funciones de archivos.
#1

Hola.

En este tutorial estoy decidido a explicarle el uso de las funciones de los archivos. Con ellos se pueden hacer muchas cosas, y aprenderlo es muy ъtil. Por ejemplo, usarlos y adaptarlos a tu GM para cargar datos para el jugador, que es mucho mбs fбcil y mбs rбpido que usar cualquier otro .inc.

  • fopen
Esta funciуn abre un archivo para editarlo/leerlo, tambiйn sirve para crearlo si no existe. Ej:

pawn Код:
public OnGameModeInit()
{
    if(!fexist("Test.txt")) // Verificamos que en 'scriptfiles' no existe el archivo 'Test' con la extensiуn 'txt'.
    {
        // Recuerden que deben aсadirle el tag 'File'.
        new File:INI = fopen("Test.txt", io_write); // Abrimos el archivo 'Test.txt'. Como en este caso no existe, se crearб.
        fwrite(INI, "Password = Tutorial\r\n"); // El '\r\n' es para escribir una nueva lнnea en el archivo.
        fclose(INI); // Cerramos el archivo.
    }
    return 1;
}

Tengan en cuenta que esto tiene 4 modos de usarlo, los cuales son:
  • io_read - Abrirб el archivo para leer su contenido.
  • io_write - Abrirб el archivo para escribir algo en йl. Tambiйn borrarб todo lo que tiene adentro (lo deja vacнo)
  • io_readwrite - Lee el archivo o lo crea.
  • io_append - Esto abrirб el archivo para escribir algo en йl, pero no dejarб vacнo al archivo, sino que seguirб escribiendo en йl.
  • io_read
Para leer una lнnea o muchas de un archivo, debemos guardarla en una variable. Ejemplo:

pawn Код:
// Supondremos que en el archivo 'Test.txt', la primera lнnea es: Password = Tutorial\r\n
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_read);
    if(INI) // Como 'fopen' devuelve '1' si el archivo abriу exitosamente, aquн verificaremos que lo hizo (en caso contrario devuelve '0').
    {
        new save[27]; // Estas variable almacenarб toda la lнnea.
        fread(INI, string); // Luego explicarй sobre 'fread' - Ahora la variable 'save' serб 'Password = Tutorial\r\n'.
        printf("* INI: %s", string);
        // En la consola dirб: * INI: Password = Tutorial
    }
    return 1;
}

  • io_write
Recuerden que esto borrarб todo lo que tenga el archivo - Esto es usado para abrir el archivo y escribir algo en йl con 'fwrite':

pawn Код:
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_write); // Al hacer esto, 'Password = Tutorial\r\n' serб borrado del archivo.
    if(INI)
    {
        fwrite(INI, "Password = Tutorial\r\n");
        fwrite(INI, "IP = 255.255.255\r\n");
        // No es necesario aсadir '\r\n' a la ъltima lнnea del archivo.
        fclose(INI);
    }
    return 1;
}
Ahora en nuestro archivo:

Код:
Password = Tutorial
IP = 255.255.255
  • io_append
Como bien sabemos, en nuestro archivo tenemos:

Код:
Password = Tutorial
IP = 255.255.255
Ahora escribiremos algo mбs en йl:

pawn Код:
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_append); // Abrirб la ъltima lнnea del archivo para escribir en ella.
    if(INI)
    {
        fwrite("AdminLevel ="); // En el archivo: AdminLevel =
        fwrite(" 10"); // Aquн seguiremos escribiendo en la lнnea que estб posicionado el fichero en el archivo.
        fclose(INI);
    }
    return 1;
}
Y en nuestro archivo encontraremos:

Код:
Password = Tutorial
IP = 255.255.255
AdminLevel = 10
  • fread
Esto lee una lнnea de un archivo y lo almacena en una cadena. Un ejemplo:

pawn Код:
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_read);
    if(INI)
    {
        new string[3][27];
        fread(INI, string[0], 28); // Leemos la primera lнnea del archivo - 'save[0]' ahora es: Password = Tutorial\r\n - El '28' (tercer argumento/parбmetro) hace referencia a la cantidad de bytes que se leerб en la lнnea.
        fread(INI, string[1]); // Leemos la segunda lнnea del archivo - 'save[1]' ahora es: IP = 255.255.255\r\n
        fread(INI, string[2]); // Leemos la segunda lнnea del archivo - 'save[2]' ahora es: AdminLevel = 10
        fclose(INI);
    }
    return 1;
}


  • fwrite
No hay mucho para explicar, pues ya lo he hecho anteriormente. Aunque, tengan en cuenta que si intentan escribir en una direcciуn que no es vбlida, el servidor se crashearб.


  • fremove
Elimina un archivo segъn la ruta que especifiquemos. Tengan en cuenta que la ruta debe ser vбlida.
Esta funciуn devuelve '1' si el archivo se borrу correctamente, caso contrario devuelve '0' si la ruta es invбlida o no tiene permisos para borrar dicho archivo.


  • fseek
Esto da un 'salto' de lнneas en el archivo.
Esta funciуn tiene 3 modos, los cuales son:
  • seek_start - Ajustar el fichero desde el principio del archivo.
  • seek_current -Ajustar el fichero desde la posiciуn actual que se estб leyendo en el archivo.
  • seek_end - Ajustar el fichero al final del archivo.
Para mбs explicaciуn, veamos el siguiente ejemplo:


pawn Код:
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_read);
    if(INI)
    {
        new string[11];
        fseek(INI, 11, seek_start); // Posicionamos el fichero al caracter nъmero '11' de la prнmera lнnea. En este caso: (vean la imagen de abajo).
        fread(INI, string); // Aquн leera toda la lнnea desde en donde posicionamos el fichero.
        fclose(INI);
    }
    return 1;
}
Imagen:


(palito negro = fichero).

En nuestra cadena almacenada encontraremos:

Код:
Tutorial\r\n
Si queremos quitar el '\r\n', bastarб con hacer esto:


pawn Код:
string[strlen(string)] = '\0'; // '\0' es para vaciar el carбcter - Limpiarб el ъltimo.
string[strlen(string)-1] = '\0'; // Limpiarб el ante-ъltimo.

// '\r' o '\n' ocupan un carбcter.

Y ahora la cadena serб:
Код:
Tutorial
Para leer lнnea por lнnea, usamos 'fread'. Ejemplo:

pawn Код:
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_read);
    if(INI)
    {
        new string[11];
        fread(INI, string); // Leemos la primera lнnea.
        fread(INI, string); // Pasamos a la segunda lнnea.
        fseek(INI, 13, seek_current); // Ahora el fichero estarб posicionado aquн: (vean la imagen de abajo).
        fclose(INI);
    }
    return 1;
}
Imagen:




  • Editar y guardar.
Para editar una lнnea y guardarla, debemos hacer algo como esto:

pawn Код:
public OnGameModeInit()
{
    new File:INI = fopen("Test.txt", io_read); // Abrimos el archivo para leerlo.
    if(INI)
    {
        new string[3][27];
        fread(INI, string[0]); // Leemos la primera lнnea y guardamos su valor.
        fread(INI, string[1]); // Pasamos a la segunda lнnea, la leemos y la guardamos.
        fread(INI, string[2]); // Pasamos a la tercer lнnea, la leemos y la guardamos.
        fclose(INI); // Aquн lo cerramos para volverlo a abrir, pero esta vez para escribir en йl.
       
        strdel(string[1], 0, 27); // Vaciamos toda la cadena.
        strins(string[1], "IP = 126.124.1.21\r\n", 0)// Ahora la cadena 'string[1]' serб: IP = 126.124.1.21\r\n
       
        INI = fopen("Test.txt", io_write); // Ahora escribiremos la informaciуn guardada.
        fwrite(INI, string[0]);
        fwrite(INI, string[1]);
        fwrite(INI, string[2]);
        fclose(INI);
    }
    return 1;
}

Y en nuestro archivo encontraremos:

Код:
Password = Tutorial
IP = 126.124.1.21
AdminLevel = 10

Bueno, creo que he explicado lo necesario como para entender. He tratado de resumirlo lo mas posible, asн que si encuentran algъn error o tienen alguna duda, estoy a su disposiciуn .
Reply
#2

De hecho, la mejor forma seria guardando cada tipo de datos en archivos diferentes.
Reply
#3

Nada mal enzo, gracias por tomarte tu tiempo, +rep.
Reply
#4

Quote:
Originally Posted by DesingMyCry
Посмотреть сообщение
De hecho, la mejor forma seria guardando cada tipo de datos en archivos diferentes.
Viйndolo de esa manera, creo que tienes razуn, pero eso no afectarнa notablemente el consumo de memoria?

Juan: gracias .
Reply
#5

Muy ъtil, sigue asн enzo.
Reply
#6

Gran Tutorial Man (y) +rep (Aunque eso se merece mas que rep un pico jajajaja ok no....)
Reply
#7

con la explicancion de la wiki es suficiente, pero bueh.

"Un gran tutorial, gracias por el efuerzo,sigue asi".
saludos,
Reply
#8

Quote:
Originally Posted by OTACON
Посмотреть сообщение
con la explicancion de la wiki es suficiente, pero bueh.

"Un gran tutorial, gracias por el efuerzo,sigue asi".
saludos,
Con tu comentario, veo que dices que el tutorial es realmente innecesario, luego dices que es un genial (lo mas tonto es que lo aсades entre comillas ).

Si ayudй a algunos estoy contento e ignorarй los comentarios estъpidos, no todos sabemos algunas cosas. Si tъ te lo 'sabes' todo, no significa que otros tambiйn.
Reply
#9

Quote:
Originally Posted by EnzoMetlc
Посмотреть сообщение
Con tu comentario, veo que dices que el tutorial es realmente innecesario, luego dices que es un genial (lo mas tonto es que lo aсades entre comillas ).

Si ayudй a algunos estoy contento e ignorarй los comentarios estъpidos, no todos sabemos algunas cosas. Si tъ te lo 'sabes' todo, no significa que otros tambiйn.

fue una critica constructiva, debes de aprender a tomarlas.
un saludos Enzito.
Reply
#10

Quote:
Originally Posted by OTACON
Посмотреть сообщение

fue una critica constructiva, debes de aprender a tomarlas.
un saludos Enzito.
їSabes quй es una crнtica constructiva?
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)