Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas com fgets


marcelonunes06

Pergunta

Estou escrevendo um código onde preciso ler dois arquivos: em um deles há apenas uma linha com 20 caracteres; no outro há muitas linhas, todas com 20 caracteres. Meu objetivo é comparar cada linha do segundo arquivo com a única linha do primeiro arquivo. O resultado da comparação será gravado em um terceiro arquivo onde para cada caractere que coincidir, eu atribuo o valor 1 e, para cada caractere que não coincidir, eu atribuo 0.

O que não consigo compreender é porque, apesar da função fgets está capturando todos os caracteres desejados dos arquivos, ela não está comparando o primeiro caractere do arquivo 1 com o primeiro caractere de cada linha do arquivo 2. (sei disso porque, antes do laço, se eu imprimo os caracteres lidos do arquivo 1, eu consigo visualizar todos que desejo. Porém, se imprimo os caracteres lidos do mesmo arquivo, dentro do laço, o código não imprime o primeiro caractere do arquivo 1). Abaixo, o código.

#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>

main(){
//Declara variáveis e solicita do usuário a entrada do gabarito oficial
char gabarito_oficial[21],gabarito_individual[21];
int i=0;
//abre o arquigo de gabaritos dos candidatos para leitura e cria e abre o arquivo onde irá escrever os gabaritos corrigidos
//também abre o arquivo com o gabarito oficial

FILE *fp1=fopen("gabaritos.txt","r");
if (fp1==NULL)
    printf("não foi possível abrir o arquivo gabaritos.txt");

FILE *fp2=fopen("gabaritos_corrigidos.txt","w");
if (fp2==NULL)
    printf("não foi possível criar o arquivo gabaritos_corrigidos.txt");

FILE *fp3=fopen("gabarito_oficial.txt","r");
if (fp3==NULL)
    printf("não foi possível abrir o arquivo gabaritos.txt");

//laço para ler o gabarito de cada candidato individualmente e comparar item a item com o gabarito oficial que está na variável
//gabarito_oficial

fgets(gabarito_oficial,22,fp3);
while (fgets(gabarito_individual,22,fp1)!=NULL){
    while (i<20){
        if(gabarito_individual==gabarito_oficial)
            fputc(49,fp2);
        else
            fputc(48,fp2);
        i=i+1;
    }
i=0;
fputc(10,fp2);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Para postar códigos sempre use a tag CODE apertando o botão <> no topo do campo de resposta, para manter a formação do seu código e evitar que o fórum faça alterações nele. Ex: O fórum sumiu com os [ i ] do seu código pois ele reconhece isso como a tag para deixar o texto em itálico, e deixou parte do seu código em itálico a partir daí.

 

Não encontrei nenhum problema com seu código, testei e funcionou como esperado, fiz alguma pequena modificação abaixo, mas nada que deveria alterar seu comportamento...

#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>

int main(){
    //Declara variáveis e solicita do usuário a entrada do gabarito oficial
    char gabarito_oficial[22], gabarito_individual[22];
    int i=0;
    
    //abre o arquigo de gabaritos dos candidatos para leitura e cria e abre o arquivo onde irá escrever os gabaritos corrigidos
    //também abre o arquivo com o gabarito oficial
    
    FILE *fp1=fopen("gabaritos.txt","r");
    if (fp1==NULL)
        printf("não foi possível abrir o arquivo gabaritos.txt");
    
    FILE *fp2=fopen("gabaritos_corrigidos.txt","w");
    if (fp2==NULL)
        printf("não foi possível criar o arquivo gabaritos_corrigidos.txt");
    
    FILE *fp3=fopen("gabarito_oficial.txt","r");
    if (fp3==NULL)
        printf("não foi possível abrir o arquivo gabaritos_oficial.txt");
    
    //laço para ler o gabarito de cada candidato individualmente e comparar item a item com o gabarito oficial que está na variável
    //gabarito_oficial
    printf("\nteste\n");
    fgets(gabarito_oficial,22,fp3);
    while (fgets(gabarito_individual,22,fp1)!=NULL){
        while (i<20){
            if(gabarito_individual[i]==gabarito_oficial[i])
                fputc('1',fp2);
            else
                fputc('0',fp2);
            i=i+1;
        }
        i=0;
        fputc('\n',fp2);
    }
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    return 0;
}

gabarito_oficial.txt :

abcdefghijklmnopqrst

gabaritos.txt :

abcdefghijklmnopqrst
fsdfgakgoshfwornrfnt
bbbbbbbbbbbbbbbbbbbb

Resultado em gabaritos_corrigidos.txt :

11111111111111111111
00000000000000000001
01000000000000000000

 

Algumas coisas a notar é que você está incluindo bibliotecas que não está usando, e o main() estava sem tipo (coloquei int).

E não há necessidade de colocar o número correspondente em ASCII do caractere para imprimi-lo, basta colocar o caractere entre aspas simples ( ' ) para indicar que é um caractere.

Obs: Aspas duplas ( " ) indica uma string/cadeia de caracteres em C.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...