[RESOLVIDO]Verificar respostas entre dois arquivos .txt (V ou F)

Galera preciso fazer uma verificação das letras de um resultado tipo um gabarito. O arquivo .txt contém as informações neste formato, por exmplo:

1;VFVF
2;VVFF

outro arquivo com a resposta correta:
1;VVVF
2;VVFF

Se estiver de acordo com as respostas do gabarito ele contabiliza os acertos, alguma ideia?

Cliente:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Cliente {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket cliente = new Socket("127.0.0.1", 12345);
        String caminho = "D:\\arquivoLadoCliente.txt";
        System.out.println("* O cliente se conectou ao servidor!");
        System.out.println("* Mensagem do cliente salva em: " + caminho);

        PrintStream saida = new PrintStream(cliente.getOutputStream());
        BufferedReader br = new BufferedReader(new FileReader(caminho));
        
        String linha = "";
        String n1 = "";
        int linhaAtual = 1;
        System.out.println("* Conteúdo do cliente: ");
        while (br.ready()) {
            linha = br.readLine();
            n1 = linha;
            System.out.println("* Linha["+linhaAtual+"]: " + linha);
            saida.println(n1);
            linhaAtual++;
        }
        br.close();
        saida.close();
    }
}

Servidor:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;

public class Servidor2 {

    public static void main(String[] args) throws IOException {
        String url = "D:\\arquivoLadoCliente.txt"; //caminho do arquivo cliente
        String url2 = "D:\\arquivoLadoServidor.txt"; //caminho do arquivo servidor
        ServerSocket servidor = new ServerSocket(12345);

        System.out.println("Porta 12345 aberta!");

        Socket cliente = servidor.accept(); //recebendo conexão com o cliente

        System.out.println("Nova conexão com o cliente " + cliente.getInetAddress().getHostAddress());

        Scanner entrada = new Scanner(cliente.getInputStream()); //Lê a entrada do cliente
        System.out.println("* Mensagem do cliente: ");
        while (entrada.hasNextLine()) {
            System.out.println(entrada.nextLine()); //retorna a mensagem enviada do cliente
        }
        entrada.close(); //fecha arquivo entrada
        servidor.close(); //fecha conexão com servidor

        //--Leitura do arquivo do cliente
        System.out.println("* Lendo arquivo do cliente: " + url);
        String leitura = null;
        Path caminho = Paths.get(url);

        BufferedReader br = new BufferedReader(new FileReader(url));
        //try catch, caso ocorra erro na criação do arquivo.
        try {
            byte[] texto = Files.readAllBytes(caminho);
            leitura = new String(texto);
            //System.out.println("* Conteúdo do arquivo: \n" + leitura);

            int linhaAtual = 1;
            String linha = null;
            while ((linha = br.readLine()) != null) {
                int numero = Integer.parseInt(String.valueOf(linha.charAt(0)));
                if ((numero == linhaAtual) && (linha.charAt(1) == ';') && (linha.trim().substring(2, 5).matches("[V+F]*"))) {
                    System.out.println("Linha["+linhaAtual+"]: Verificado com sucesso...");
                } else {
                    System.out.println("Linha["+linhaAtual+"]: Erro na verificação...");
                    System.exit(0);
                }
                linhaAtual++;
            }

        } catch (Exception erro) {

        }

        //--Salvando arquivo no servidor
        System.out.println("* Salvando arquivo no servidor: " + url2);
        Path caminho2 = Paths.get(url2);
        String texto = leitura;
        byte[] textoEmByte = texto.getBytes();
        try {
            Files.write(caminho2, textoEmByte);
        } catch (Exception erro) {

        }
        
        //verifica
        
        
        //Quantidade de palavras
        int palavraV = 0;
        int palavraF = 0;
        String frase = " ";
        frase = texto;
        for (int i = 0; i < frase.length(); i++) {
            if (frase.charAt(i) == 'V') {
                palavraV = palavraV + 1;
            }
            if (frase.charAt(i) == 'F') {
                palavraF = palavraF + 1;
            }
        }
        System.out.println("Quantidade V:" + palavraV);
        System.out.println("Quantidade F:" + palavraF);

    }
}
1 curtida

No caso recebo um arquivo do cliente e salvo com outro nome no servidor… e tenho um outro arquivo gabarito, que tem as respostas certas, a ideia seria comparar o resultado do arquivoLadoServidor.txt com o gabarito.txt

if (arquivoLadoServidor[i] == gabarito[i])
                pontuacao++;
        }

Algo assim, porém não estou sabendo implementar…

1 curtida

Considerando que você já tem um tópico sobre um problema semelhante, qual a dúvida?
Como você resolveu isso? Como fez para ler o valor do primeiro caractere de cada linha? Não dá para ler caractere a caractere e comparar?

@darlan_machado no outro tópico era pra comparar os caracteres de um único arquivo… agora é pra comparar dois arquivos, um com o outro, essa é a dúvida

1 curtida

Cara, sabe por que existem laços de repetição? É para você executar o mesmo trecho de código por N vezes, sem precisar reescrever aquela parte do código.
Veja, se você consegue ler 1 arquivo e obter os valores dentro dele, você consegue ler 100, 20000 arquivos e lê-los.
Vamos mudar o foco, suponha que, ao invés de arquivos, você tem as duas Strings:

String s1 = "1;VVFVFFV\n2;VFVFVFV\n3;VVFFVVF";
String s2 = "1;VVFVVVF\n2;VVFFVFV\n3;VVFFVVF";

Como você compararia as duas,letra a letra?

1 curtida

@darlan_machado algo como:

int pontuacao = 0;

        Scanner sc = new Scanner(System.in);

        String gabaritoVetor[] = new String[3];
        String notaVetor[] = new String[3];

        System.out.println("Digite o gabarito: ");
        for (int c = 0; c < gabaritoVetor.length; c++) {
            System.out.print("Gabarito | questão[" + c + "]: ");
            gabaritoVetor[c] = sc.next();

        }
        for (int i = 0; i < notaVetor.length; i++) {
            System.out.print("Questão[" + i + "]: ");
            notaVetor[i] = sc.next();
            if (notaVetor[i].equals(gabaritoVetor[i])) {
                pontuacao++;
            }
        }

        System.out.println("Pontuação: " + pontuacao);

Algo assim? Não teria que colocar dentro de um vetor?

1 curtida

Depende de como você pretende abordar a solução.
Mas, pode ser feito.
Cada arquivo será lido linha a linha. Cada linha é uma String. Cada String é um array de char.
Logo, você consegue fazer isso de N formas diferentes.
Mas, em todas elas, precisará comparar o conteúdo de cada linha, item a item.

1 curtida

No caso queria comparar dois arquivos .txt e verificar se cada carácter é igual ao do outro arquivo e somar os acertos, quais caracteres são iguais… Tipo um gabarito

um arquivo prova.txt possui o seguinte conteúdo:

1;VVFF
2;VFVF
3;FFFV

O gabarito possui o conteúdo:

1;VVFF
2;FFVV
3;FFFF

Fazer uma comparação e somar quantas respostas acertaram

int pontuacao = 0;

Scanner sc = new Scanner(System.in);

String gabaritoVetor[] = new String[3];
String notaVetor[] = new String[3];

for (int c = 0; c < gabaritoVetor.length; c++) {
gabaritoVetor[c] = leitura; //recebe os dados do prova.txt

}
for (int i = 0; i < notaVetor.length; i++) {
notaVetor[i] = leitura2; //recebe os dados do gabarito.txt
if (notaVetor[i].equals(gabaritoVetor[i])) {
pontuacao++;
}
}

System.out.println("\nPontuação: " + pontuacao);

Testei com os arquivos iguais deu certo, quando modifiquei deu Pontuação = 0 Se os arquivos forem iguais mostra Pontuação = 3

Não estou sabendo fazer… :frowning:

1 curtida

Cada arquivo terá, apenas, 3 linhas?

Lembra que eu disse isso:

Se você usar a comparação de cada linha, como String, você não vai ter uma comparação válida de cada item.
Como eu ressaltei:

Se cada linha é uma String e toda String é um array de char, você deve iterar sobre cada linha e comparar, caractere a caractere. Algo como

for (int i = 0; i < notaVetor.length; i++) {
    String nota = notaVetor[i];
    String gabarito = gabaritoVetor[i];
    for(int x = 2; x < nota.length(); x++){ // Posição 0 corresponde ao número e posição 1 corresponde a ;
         
        if(nota.charAt(x) == gabarito.charAt(x) {
             pontuacao++;
        }
    }
}

Deu erro…

Exception in thread "main" java.lang.NullPointerException
	at Servidor2.main(Servidor2.java:110)

Nesse for

for(int x = 2; x < nota.length(); x++){

Sim, vai ter apenas 3 linhas

Se nota está null, não tem como chamar o método length().

No caso leitura = new String(texto); seria o conteúdo do arquivo, notaVetor[i] receberia leitura então?

Consegui resolver o problema assim:

public void verificaR(String resp, String gabarito) {
    for (int i = 2; i < resp.length(); i++) {
        if (resp.charAt(i) == gabarito.charAt(i)) {
            pontuacao++;
            soma = soma + pontuacao;
        } else {
            erros++;
            somaErro = somaErro + erros;
        }
    }
    System.out.println("Total de Acertos: " + pontuacao);
    System.out.println("Total de Erros: " + erros);
    System.out.println("----------");
}

E dentro do main:

try {
            Servidor serv = new Servidor();
            String url = "D:\\gabarito.txt";

            FileReader arq = new FileReader(url);
            BufferedReader lerArq = new BufferedReader(arq);

            //Porta 12345 do Socket
            ServerSocket servidor = new ServerSocket(12345);
            System.out.println("Servidor ouvindo a porta 12345");

            while (true) {

                Socket cliente = servidor.accept();
                Scanner entrada = new Scanner(cliente.getInputStream());

                String leitura = lerArq.readLine();
                String respAluno = entrada.nextLine();

                System.out.println("* Cliente conectado: " + cliente.getInetAddress().getHostAddress() + "\n");
                for (int j = 1; j < respAluno.length(); j++) {
                    System.out.println("Gabarito Linha[" + j + "]: \t" + leitura);
                    System.out.println("Arquivo Aluno[" + j + "]: \t" + respAluno);

                    serv.verificaR(leitura, respAluno);
                    respAluno = entrada.nextLine();
                    leitura = lerArq.readLine();

                    PrintStream saida = new PrintStream(cliente.getOutputStream());
                    saida.print("");
                }
            }

Esqueci de mencionar, era utilizando Socket, dai depois faz a leitura do arquivo do cliente e do servidor. :sweat_smile::kissing_heart: