Изменять “Точки” бинарный файл (изменять из-за SEEK)

Я нуждаюсь в помощи со следующим куском кода:

 case 1:
System.out.println("Actualizar Puntos");
int registro = 1;
// Nuevos puntos (entrada del usuario)
punts = 40;
// Posición donde comienza el registro
int pos = 48 * (registro - 1);
// Mover a la posición donde empieza el dato
pos += 4 + 20 + 20;
raf.seek(pos);
raf.writeInt(punts);              

   break;

Напечатав данные из-за экрана я наблюдаю, что он обновляет все результаты в 40:

ID: 50
Nombre Instituto: inst1
Nombre Equipo: equi1
Puntos: 40

ID: 600
Nombre Instituto: inst2
Nombre Equipo: equip2
Puntos: 40

ID: 6000
Nombre Instituto: inst3
Nombre Equipo: equip3
Puntos: 40

У каждого реестра должно бы быть различное число точек. Например: первый 40 точек, второй 60 точек, третий 30 точек, и т.д.

Проблема состоит в том, что все реестры обновляют 40, когда был бы должен идти реестр из-за реестра. Не все сразу.

Что я врежу?

По просьбе присоединенного пользователя полный код для ревизии:

Часть 1 (Где попадают данные в бинарный файл)

/**
 * OPCIO 1  ACTIVITAT 2
 */
package activitat2;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
/**
 * ACTIVITAT 2 EAC 6
 * @author Montse
 */
    public class Opcio1{
    /**
     * En aquesta activitat la número 2 farem:
     * Introduir instituts
     * Listar instituts introduïts
     * Sortir
     * Tornar al menú principal
     * @throws FileNotFoundException
     * @throws IOException
     */

    static void IntroduirInstituts() throws FileNotFoundException, IOException{
        RandomAccessFile raf;
        raf = new RandomAccessFile("Partides.dat", "rw");

        System.out.println("HAS ESCOLLIT OPCIÓ 1");
        System.out.println("--------------------------------");
        System.out.println("Institutos que participarán en infoguardians");
        System.out.println("1-Registrar los datos de los institutos ");
        System.out.println("2-Listar todos los institutos");
        System.out.println("3-Volver al menú principal");
        System.out.println("4- Salir");
        System.out.println("Escoje una opción");

        Scanner lector = new Scanner(System.in);

        int punts       = 0;
        int enterLlegit = 0;
        boolean llegit  = false;

        while(!llegit){
            llegit = lector.hasNextInt();
            if (llegit){

                enterLlegit = lector.nextInt();

                switch (enterLlegit){
                case 1:
                    System.out.println("Registra los datos de los institutos:");
                    System.out.println("Quantos institutos participan en el concurso?");
                    boolean leido = false;
                    while(!leido){

                        leido = lector.hasNextInt();
                        if (leido){

                            int enterLlegit2 = lector.nextInt();
                            System.out.println("Numero total de centros: "+enterLlegit2);
                            System.out.println("El fitxer s'ha creat. Accés directe");
                            for (int j = 0, pos = 0; j < enterLlegit2; j++){
                                int i = 0;
                                i = enterLlegit2;
                                if(enterLlegit2 > 0){

                                    System.out.println("-------------------------------------");
                                    System.out.println("Introduce la info sobre el instituto:");
                                    System.out.println("-------------------------------------");
                                    System.out.println("Id?");

                                    int idInst = lector.nextInt();

                                    System.out.println("Nom Institut:");

                                    String nomInst = lector.next();

                                    System.out.println("Nom Equip:");

                                    String nomEqui = lector.next();

                                    System.out.println();

                                    System.out.println("------------------------------------------");
                                    System.out.println("::INFORMACIÓN SOBRE CENTRO INSCRITO::");
                                    System.out.println("------------------------------------------");
                                    System.out.println("Id: " +idInst);
                                    System.out.println("Nom Institut: "+nomInst);
                                    System.out.println("Equip: "+nomEqui);
                                    System.out.println("Punts: "+punts);
                                    System.out.println();


                                    raf.seek(pos);
                                    raf.writeInt(idInst);
                                    pos +=4;
                                    raf.seek(pos);
                                    raf.writeUTF(nomInst);
                                    pos +=20;
                                    raf.seek(pos);
                                    raf.writeUTF(nomEqui);
                                    pos+=20;
                                    raf.seek(pos);
                                    raf.writeInt(punts);
                                    pos +=4;

                                }
                            }

                        }else {
                            System.out.println("No has escrito un entero, vuelve a intentarlo");
                            lector.next();
                        }
                    }

                    break;
                case 2:
                    System.out.println("------------------------------------");
                    System.out.println("HAS ESCOGIDO LISTAR LOS INSTITUTOS");
                    System.out.println("------------------------------------");
                    for (int pos = 0;;){

                        try
                        {
                            raf.seek(pos);

                            System.out.println("ID: " +raf.readInt());
                            pos += 4;

                            raf.seek(pos);
                            System.out.println("Nombre Instituto: "+raf.readUTF());
                            pos += 20;

                            raf.seek(24);
                            System.out.println("Nombre Equipo: "+raf.readUTF());
                            pos += 20;

                            raf.seek(44);
                            System.out.println("Puntos: "+raf.readInt());
                            pos += 4;

                            System.out.println();
                        }
                        catch (EOFException e)
                        {
                            // Fin de archivo
                            break;
                        }
                    }
                case 3:
                    System.out.println("TORNAR AL MENÚ PRINCIPAL::::");
                    MenuPrincipal.EscollirOpcio();

                case 4:
                    System.out.println("Hasta la próxima!");
                    break;
                default:
                    System.out.println("No has escrito una opción válida");
                    System.out.println("Fin del programa");
                    break;
                }

            }else {

                System.out.println("No has escrito un entero, vuelve a intentarlo");
                lector.next();
            }
        }
        lector.nextLine();


    }
}

Часть 2 кода, где я хочу изменить:

/**
 * OPCIO 2  ACTIVITAT 3
 */
package activitat2;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;
/**
 *
 * @author Montse
 */


 public class Opcio2 {
    /**
     * En aquesta clase farem les demandes de l'activitat 2
     * @throws FileNotFoundException
     */
    static void ActualitzarInstituts() throws FileNotFoundException, IOException {
        RandomAccessFile raf;
        raf = new RandomAccessFile("Partides.dat", "rw");

        System.out.println("HAS ESCOLLIT OPCIÓ 2");
        System.out.println("--------------------------------");
        System.out.println("Institutos que participarán en infoguardians");
        System.out.println("1-Actualizar Puntos");
        System.out.println("2- Salir");
        System.out.println("3- Volver al menú principal");
        System.out.println("Escoje una opción");

        Scanner lector = new Scanner(System.in);

        int punts       = 0;
        int enterLlegit = 0;
        boolean llegit  = false;

        while(!llegit) {

            llegit = lector.hasNextInt();

            if (llegit) {

                enterLlegit = lector.nextInt();

                switch (enterLlegit) {
                case 1:
                    System.out.println("Actualizar Puntos");
                    // Primero enseñaremos los intitutos que tenemos registrados
                    System.out.println("LOS CENTROS INTRODUCIDOS SÓN:::::::");
                    System.out.println("-----------------------------------");

                    for (int pos = 0;;){

                        try
                        {
                            raf.seek(pos);

                            System.out.println("ID: " +raf.readInt());
                            pos += 4;

                            raf.seek(pos);
                            System.out.println("Nombre Instituto: "+raf.readUTF());
                            pos += 20;

                            raf.seek(24);
                            System.out.println("Nombre Equipo: "+raf.readUTF());
                            pos += 20;

                            raf.seek(44);
                            System.out.println("Puntos: "+raf.readInt());
                            pos += 4;

                            System.out.println();
                        }
                        catch (EOFException e)
                        {
                            // Fin de archivo

                        }
                        System.out.println("Actualizar Puntos");
                        int registro = 1;
                        // Nuevos puntos (entrada del usuario)
                        punts = 40;
                        // Posición donde comienza el registro
                        pos = 48 * (registro - 1);
                        // Mover a la posición donde empieza el dato
                        pos += 4 + 20 + 20;
                        raf.seek(pos);
                        raf.writeInt(punts);

                        break;
                    }

                case 2:
                    System.out.println("Hasta la próxima!");
                    break;
                default:
                    System.out.println("No has escrito una opción válida");
                    System.out.println("Fin del programa");
                    break;
                }

            }else {
                System.out.println("No has escrito un entero, vuelve a intentarlo");
                lector.next();
            }
        }
        lector.nextLine();


    }
}
4
задан 07.01.2016, 19:08
2 ответа

Так как у каждого реестра есть 48-байтовая длина, которого существуют некоторые в файле, тогда чтобы изменять точки в каждом из них (каждый с одной puntuaciГіn различный, конечно), может использовать цикл for.

for (int registro = 1;; registro++) {
    int pos = 48 * (registro - 1);
    try {
        System.out.printf("Registro #%02d%n", registro);
        pos += 4 + 20 + 20;

        // Lectura
        raf.seek(pos);
        System.out.printf("Puntos actuales: %d%n", raf.readInt());

        // Escritura
        System.out.print("Introducir puntos: ");
        int puntos = scanner.nextInt();
        raf.seek(pos);
        raf.writeInt(puntos);
    } catch (EOFException e) {
        break;
    }
}

Любой operaciГіn чтения (например, raf.readInt()) despuГ©s конца файла бросает ее excepciГіn EOFException, благодаря тому, что не возможно читать despuГ©s конца файла (хотя sГ - писать). Может использоваться это для того, чтобы идентифицировать конец файла и для того, чтобы ломать цикл for.

2
ответ дан 24.11.2019, 15:01
 case 1:
System.out.println("Actualizar Puntos");
int registro = 1;
// Nuevos puntos (entrada del usuario)
punts = 40;
// Posición donde comienza el registro
int pos = 48 * (registro - 1);
// Mover a la posición donde empieza el dato
pos += 4 + 20 + 20;
raf.seek(pos);
raf.writeInt(punts);              

   break;

.

ID: 50
Nombre Instituto: inst1
Nombre Equipo: equi1
Puntos: 40

ID: 600
Nombre Instituto: inst2
Nombre Equipo: equip2
Puntos: 40

ID: 6000
Nombre Instituto: inst3
Nombre Equipo: equip3
Puntos: 40

не, если это будет истинный ответ на то, что Вы ищете, но я прокомментирую ему то, что я вижу, как я понимаю то, что он спрашивает:

Вы говорите

->, напечатав данные из-за экрана, я наблюдаю, что он обновляет все результаты в 40:

//..
// Nuevos puntos (entrada del usuario)
punts = 40;
//..
raf.writeInt(punts);
//..

я ни в каком месте вижу, что Вы распределили другую стоимость varible punts, которого нет 40. То, что соединяется, в которое Вы комментируете после

->, Каждый реестр deberГ, - чтобы иметь один nГєmero точек различно. Например: первый 40 точек, второй 60 точек, третий 30 точек, и т.д.

я не понимаю, откуда он достает, что первый 40, второй 60, третий 30, ни, из-за которого он был бы должен хранить эту стоимость, когда punts = 40.

Эта часть также - что-то смущенная (для меня)

->..., когда deberГ - чтобы, идти, я регистрирую из-за реестра.

//..
viendo esto -> int registro = 1;
y esto      -> int pos 48 * (registro -1);

то, что я представляю себе, что Вы хотите сделать, состоит в том, чтобы отпускать от положения другую, ее, у которого есть та же внутренняя структура, чтобы менять биты / контенты этого положения. Если это так, из-за которого я регистрирую всегда, он равен 1? он не был бы должен меняться, чтобы продвигаться в каждом itereacion.

UPDATE

после aГ±adir код @Paul Варгасом, который функционировал как ждали, что появилась ошибка, которая не показывала все реестры после того, как консультировал их, но если они хорошо хранились кодом Поля, я оказываюсь, что ошибка была здесь:

raf.seek(24); 
System.out.println("Nombre Equipo: "+raf.readUTF()); 
pos += 20; 

raf.seek(44); 
System.out.println("Puntos: "+raf.readInt()); 
pos += 4; 

был нужен меняться raf.seek (pos);

3
ответ дан 24.11.2019, 15:01
  • 1
    Я отвечаю тебе! Точки это из-за того, что помещает пример, в моем упражнении просят его пользователя, который обновляет точки всех реестров. В этом случае я начинаю представлять, что я ввел 3 реестра. А следовательно я нуждаюсь в том, чтобы ввести 3 различные точки, так как они не имеют из-за которого совпадать. и если я хочу прыгнуть posici и # 243; n из-за posici и # 243; n, но только чтобы изменять ту точек. –  Montse Mkd 07.01.2016, 19:22
  • 2
    @MontseMkd я комментирую тебе, что переменная, которая берется за то, чтобы хранить точки, - punts, тогда эта переменная, где ты должен хранить новые точки, которые ты хочешь написать, например он piedes пользователю, который ты вводишь их, и хранишь их там, или ты помещаешь их другой формы. –  Angel Angel 07.01.2016, 19:36
  • 3
    @MontseMkd С другой стороны тем, что может видеть реестры, они имеют длину 48 и последние 4 соответствуй, куда ты хранишь точки (если я не ошибаюсь) тогда, если реестр равен 1, он напишет в первом реестре, хочешь ли ты написать в реестре 3 ты должен менять стоимость реестра, для того, чтобы стоил реестр = 3 –  Angel Angel 07.01.2016, 19:36
  • 4
    @MontseMkd это о реестре = 3 или другое число я говорю это тебе, потому что, если может встречаться случай, который у Вас был файл с несколькими реестрами, и если он хочет изменить реестр, который находится в третьем одиноком месте, нужно отпускать тех, которые раньше, и это может делать это, распределив rigistro = 3 или положение, в которое он хочет прыгнуть, не будучи должен делать никакого типа повторения, он был бы что-то подобное, что selecionas registro/intituto, который мы говорим, что это три, так как ты веришь в функцию, что ты перемещаешь его место 3 и осуществляешь код, сходный с тем, который использовать, но сейчас реестр стоит 3, и прыгаешь в это место –  Angel Angel 07.01.2016, 19:50
  • 5