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

(Resolvido) Copiar arquivo por bloco


AlineI

Pergunta

Bom, implementei programas de cópia de arquivo por caracter, linha e bloco... mas o de bloco tem um pequeno erro.

O programa consiste em informar um RGM e o nome do aluno (RGM e Aluno em uma struct)... quando quiser parar, informe -1 para o RGM. Então a ultima struct informada (RGM e Aluno), são repetidos no arquivo de saída, aparecem dois iguais... por exemplo:

Programa sendo executado:

RGM: 12

Aluno: Aline

RGM: 15

Aluno: Gessica

RGM: -1

process returned 1 (0x1) execution time...

Ok.

Lá na pasta onde estou gravando o .txt com o arquivo de Entrada e o de Saida(cópia)... o de Entrada está perfeito, enquanto o de Saída repete as informações da ultima struct, no caso do exemplo, exibe Géssica e seu rgm duas vezes.

Aí vai o código:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    char nome[20];
    int rgm;
}tReg;

tReg regAluno;

unsigned CopiaArqPorBloco (const char *arqDeEntrada, const char *arqDeSaida)
{
    FILE *ptrEntrada, *ptrSaida; /*streams*/
    char c;
    ptrEntrada = fopen(arqDeEntrada, "rb");

    if(ptrEntrada == NULL)
        return 0;
    ptrSaida = fopen(arqDeSaida, "wb");
    if(ptrSaida == NULL)
    {
        fclose(ptrEntrada);
        return 0;
    }
    do
    {
        fread (&regAluno, sizeof(tReg), 1, ptrEntrada);
        fwrite (&regAluno, sizeof(tReg), 1, ptrSaida);
    }while (!feof(ptrEntrada));

    fclose(ptrEntrada);
    fclose(ptrSaida);

    return 1;
}

int CriaArq(char *nomeArq)
{
    FILE *ptrArq;
    tReg Aluno;

    ptrArq = fopen(nomeArq, "wb");

    if (ptrArq == NULL)
        return 0;

    do
    {
        printf("RGM: ");
        scanf("%d", &Aluno.rgm);
        if (Aluno.rgm!= -1)
        {
            printf("Nome: ");
            scanf("%s", Aluno.nome);
            fwrite (&Aluno, sizeof(tReg), 1, ptrArq);
        }
    }while (Aluno.rgm != -1);
    fclose(ptrArq);
    return 1;
}
int main()
{
    char *nomeArqE, *nomeArqS;

    //printf("Informe o nome do Arquivo: ");
    //scanf("%s", nomeArq);
    nomeArqE = "ArqEntrada.txt";
    nomeArqS = "ArqSaida.txt";

    if (!CriaArq(nomeArqE))
    {
        printf("Falhou CriaArq");
        return 0;
    }
    if (!CopiaArqPorBloco(nomeArqE, nomeArqS))
    {
        printf("Falhou CopiaArqPorBloco");
        return 0;
    }

    return 1;
}

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

aline, isso ta acontecendo porque ele só vai dar eof do arquivo de entrada depois de já ter lido a gessica quando tentar ler de novo.

tipo, ele le aline e ai td bem. ai ele le a gessica. o arquivo acabou mas ele não sabe, você pediu pra ler o tamanho do struct, mas ele não sabe o q tem depois. então ele tenta ler o arquivo e ai sim vai dar eof. e como deu eof ele não preencheu nd em regAluno, q vai continua com o valor anterior. ai você manda imprimir de novo e ele imprime de novo.

faca seu while assim q deve funionca:

fread (&regAluno, 1, sizeof(tReg), ptrEntrada);
while (!feof(ptrEntrada))
{          
    fwrite (&regAluno, sizeof(tReg), 1, ptrSaida);        
    fread (&regAluno, 1, sizeof(tReg), ptrEntrada);    
}[/code]

Link para o comentário
Compartilhar em outros sites

  • 0
Como que eu faço pra colocar [resolvido] no tópico?

:rolleyes:

primero de tudo, tem q se tornar moderadora hehe

EDITADO:

alias, se não me engano se você por pra editar o primero post do tópico, você pode editar o titulo.

não sei se funciona pra membro comum ou so pra moderador, mas se não me engano já vi membro comum editar titulo sim...

Editado por kuroi
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...