Ir ao conteúdo
  • Cadastre-se

C Programa não está considerando nomes do arquivo.txt


Jpf Mito

Posts recomendados

Depois de informar alguns nomes de alunos, fechar o programa e abrir novamente, quando vou informar mais alunos ele volta para o número 1, não considerando os que já foram lançados no arquivo.txt assim ultrapassando o limite de 10 alunos.

 

esse é o código:

 

void lancamento()
{
    int result;

    FILE* arquivo = fopen("lancamentoss.txt", "a");

    if (arquivo == NULL)
    {
        printf("Erro ao abrir arquivo.\n");
        system("pause");
        exit(1);
    }

    printf("***************************************************************************");
    printf("\nLANÇAMENTOS DE NOTAS E FREQUÊNCIAS    ");
    printf("\n***************************************************************************");

    if (i < 10)
    {
        printf("\nAluno %d", i + 1);
        printf("\nDigite a matrícula: ");
        scanf("%d", &infAluno[i].matricula);
        printf("Digite o nome: ");
        getchar();
        fgets(infAluno[i].nome, 80, stdin);
        infAluno[i].nome[strcspn(infAluno[i].nome, "\n")] = '\0';
        printf("Digite o percentual de frequência: ");
        scanf("%d", &infAluno[i].freq);
        printf("Digite as três notas: ");
        scanf("%f%f%f", &infAluno[i].notas[0], &infAluno[i].notas[1], &infAluno[i].notas[2]);
        infAluno[i].media = 0;
        strcpy(infAluno[i].resultado, "x");
        i++;

        result = fprintf(arquivo, "%d;%s;%d;%.2f;%.2f;%.2f;%.2f;%s\n", infAluno[i-1].matricula, infAluno[i-1].nome, infAluno[i-1].freq, infAluno[i-1].notas[0], infAluno[i-1].notas[1], infAluno[i-1].notas[2], infAluno[i-1].media, infAluno[i-1].resultado);
        if (result < 0)
        {
            printf("Erro ao criar arquivo!");
            system("pause");
            return;
        }

        fclose(arquivo);

        printf("\nDeseja continuar? (0-Sim, 1-Não): ");
        scanf("%d", &simnao);
        switch (simnao)
        {
        case 0:
            system("cls");
            lancamento();
            break;
        case 1:
            printf("Voltando ao menu principal...\n");
            system("pause");
            break;
        }
    }
    else
    {
        printf("\nLimite de alunos atingido!\n");
        system("pause");
    }
}

 

Link para o comentário
Compartilhar em outros sites

Poste o programa inteiro, compilável. E o conteúdo do arquivo de entrada...

 

Não dá pra dizer muito vendo fragmentos

 

De todo modo o que postou não está nada bom. NUNCA use void () a menos que vá encerrar o programa. Use argumentos. 

 

Escreva em torno dos dados. Antes de tudo defina os dados. Ou vai levar muito mais tempo para ter muito menos resultado e chegar a algo que atenda ao esperado

 

Link para o comentário
Compartilhar em outros sites

@arfneto é porque é um trabalho final da faculdade, preciso criar assim. aqui o código inteiro

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

char SouN;
int simnao;
int i = 0;
int relatorioFechado = 0;

struct alunos
{
    int matricula;
    char nome[80];
    int freq;
    float notas[3];
    float media;
    char resultado[10];
};

struct alunos infAluno[10];

void exibeMenu();
void lancamento();
void consulta();
void relatorio();
void estatisticas();
void sair();

int main()
{
    setlocale(LC_ALL, "Portuguese");
    int opt;
    do
    {
        system("cls");
        exibeMenu();
        printf("\n");
        printf("\nEscolha a opção desejada: ");
        scanf("%d", &opt);

        switch (opt)
        {
        case 1:
            system("cls");
            if (relatorioFechado)
            {
                printf("O relatório já foi fechado, não é possível fazer novos lançamentos!\n");
                system("pause");
            }
            else
            {
                lancamento();
            }
            break;
        case 2:
            system("cls");
            consulta();
            break;
        case 3:
            system("cls");
            relatorio();
            break;
        case 4:
            system("cls");
            estatisticas();
            break;
        case 5:
            system("cls");
            sair();
            break;
        default:
            printf("\nOPÇÃO INVÁLIDA!!! Digite um número de 1 a 5.\n");
            system("pause");
        }
    } while (opt > 0 || opt < 6);

    return 0;
}

void exibeMenu()
{
    printf("*****************************************************************************");
    printf("\nGESTÃO DE AVALIAÇÕES - ALGORITMOS E PROGRAMAÇÃO    ");
    printf("\n***************************************************************************");

    printf("\n1- Lançar avaliações e frequências");
    printf("\n2- Consultar avaliações e frequências lançadas");
    printf("\n3- Gerar relatório de fechamento");
    printf("\n4- Apresentar estatísticas");
    printf("\n5- Sair do programa");
}

void lancamento()
{



    int result;
    FILE* arquivo = fopen("lancamentoss.txt", "a");

    if (arquivo == NULL)
    {
        printf("Erro ao abrir arquivo.\n");
        system("pause");
        exit(1);
    }

    printf("***************************************************************************");
    printf("\nLANÇAMENTOS DE NOTAS E FREQUÊNCIAS    ");
    printf("\n***************************************************************************");

    if (i < 10)
    {
        printf("\nAluno %d", i + 1);
        printf("\nDigite a matrícula: ");
        scanf("%d", &infAluno[i].matricula);
        printf("Digite o nome: ");
        getchar();
        fgets(infAluno[i].nome, 80, stdin);
        infAluno[i].nome[strcspn(infAluno[i].nome, "\n")] = '\0';
        printf("Digite o percentual de frequência: ");
        scanf("%d", &infAluno[i].freq);
        printf("Digite as três notas: ");
        scanf("%f%f%f", &infAluno[i].notas[0], &infAluno[i].notas[1], &infAluno[i].notas[2]);
        infAluno[i].media = 0;
        strcpy(infAluno[i].resultado, "x");
        i++;

        result = fprintf(arquivo, "%d;%s;%d;%.2f;%.2f;%.2f;%.2f;%s\n", infAluno[i-1].matricula, infAluno[i-1].nome, infAluno[i-1].freq, infAluno[i-1].notas[0], infAluno[i-1].notas[1], infAluno[i-1].notas[2], infAluno[i-1].media, infAluno[i-1].resultado);
        if (result < 0)
        {
            printf("Erro ao criar arquivo!");
            system("pause");
            return;
        }

        fclose(arquivo);

        printf("\nDeseja continuar? (0-Sim, 1-Não): ");
        scanf("%d", &simnao);
        switch (simnao)
        {
        case 0:
            system("cls");
            lancamento();
            break;
        case 1:
            printf("Voltando ao menu principal...\n");
            system("pause");
            break;
        }
    }
    else
    {
        printf("\nLimite de alunos atingido!\n");
        system("pause");
    }
}

void consulta()
{
    FILE* arquivo = fopen("..\\trabteste\\lancamentoss.txt", "r");

    printf("***************************************************************************");
    printf("\nCONSULTA DE AVALIAÇÕES E FREQUÊNCIAS    ");
    printf("\n***************************************************************************");

    printf("\n%-20s %-25s %-15s %-10s %-10s %-10s %-10s %-10s", "Matrícula", "Nome", "Frequência", "Nota1", "Nota2", "Nota3", "Média", "Resultado");
    printf("\n------------------------------------------------------------------------------------------------------------------");
    printf("\n");

    int lancamentos = 0;
    int i = 0;
    while (fscanf(arquivo, "%d;%[^;];%d;%f;%f;%f;%f;%s\n", &infAluno[i].matricula, infAluno[i].nome, &infAluno[i].freq, &infAluno[i].notas[0], &infAluno[i].notas[1], &infAluno[i].notas[2], &infAluno[i].media, infAluno[i].resultado) != EOF)
    {
        printf("%-20d %-25s %-15d %-10.2f %-10.2f %-10.2f %-10.2f %-10s\n", infAluno[i].matricula, infAluno[i].nome, infAluno[i].freq, infAluno[i].notas[0], infAluno[i].notas[1], infAluno[i].notas[2], infAluno[i].media, infAluno[i].resultado);
        i++;
        lancamentos++;
    }
    if (lancamentos == 0)
    {
        printf("Nenhum lançamento encontrado!\n");
    }

    fclose(arquivo);

    system("pause");
}

void relatorio()
{
    printf("***************************************************************************");
    printf("\nGERAÇÃO DE RELATÓRIO DE FECHAMENTO    ");
    printf("\n***************************************************************************");
    printf("\nDeseja realmente encerrar a disciplina? (S/N): ");
    getchar();
    scanf("%c", &SouN);

    switch (SouN)
    {
    case 'S':
    case 's':
    {
        FILE* arquivoLancamentos = fopen("..\\trabteste\\lancamentoss.txt", "r");
        FILE* arquivoRelatorio = fopen("relatorio.txt", "w");

        printf("\n%-20s %-25s %-15s %-10s %-10s %-10s %-10s %-10s", "Matrícula", "Nome", "Frequência", "Nota1", "Nota2", "Nota3", "Média", "Resultado");
        printf("\n------------------------------------------------------------------------------------------------------------------");
        printf("\n");

        int lancamentos = 0;
        int i = 0;
        while (fscanf(arquivoLancamentos, "%d;%[^;];%d;%f;%f;%f;%f;%s\n", &infAluno[i].matricula, infAluno[i].nome, &infAluno[i].freq, &infAluno[i].notas[0], &infAluno[i].notas[1], &infAluno[i].notas[2], &infAluno[i].media, infAluno[i].resultado) != EOF)
        {
            float media = (2 * infAluno[i].notas[0] + 3 * infAluno[i].notas[1] + 5 * infAluno[i].notas[2]) / 10.0;

            if (media >= 7 && infAluno[i].freq >= 75)
            {
                strcpy(infAluno[i].resultado, "Aprovado");
            }
            else
            {
                strcpy(infAluno[i].resultado, "Reprovado");
            }

            printf("%-20d %-25s %-15d %-10.2f %-10.2f %-10.2f %-10.2f %-10s\n", infAluno[i].matricula, infAluno[i].nome, infAluno[i].freq, infAluno[i].notas[0], infAluno[i].notas[1], infAluno[i].notas[2], media, infAluno[i].resultado);
            fprintf(arquivoRelatorio, "%d;%s;%d;%.2f;%.2f;%.2f;%.2f;%s\n", infAluno[i].matricula, infAluno[i].nome, infAluno[i].freq, infAluno[i].notas[0], infAluno[i].notas[1], infAluno[i].notas[2], media, infAluno[i].resultado);
            i++;
            lancamentos++;
        }

        if (lancamentos == 0)
        {
            printf("Nenhum lançamento encontrado!\n");
        }

        fclose(arquivoLancamentos);
        fclose(arquivoRelatorio);
        relatorioFechado = 1;
        break;
    }
    case 'N':
    case 'n':
        printf("Voltando ao menu principal...\n");
        system("pause");
    }

    system("pause");
}

void estatisticas()
{
    printf("***************************************************************************");
    printf("\nAPRESENTAÇÃO DE ESTATÍSTICAS    ");
    printf("\n***************************************************************************");

    FILE* arquivo = fopen("..\\trabteste\\relatorio.txt", "r");
    if (arquivo == 0)
    {
        printf("Erro ao abrir arquivo!");
        system("pause");
    }

    float mediaTurma = 0.0;
    float mediaFreqTurma = 0.0;
    int numAprovados = 0;
    int numReprovados = 0;

    int i = 0;
    while (fscanf(arquivo, "%d;%[^;];%d;%f;%f;%f;%f;%s\n", &infAluno[i].matricula, infAluno[i].nome, &infAluno[i].freq, &infAluno[i].notas[0], &infAluno[i].notas[1], &infAluno[i].notas[2], &infAluno[i].media, infAluno[i].resultado) != EOF)
    {
        mediaTurma += infAluno[i].media;
        mediaFreqTurma += infAluno[i].freq;

        if (infAluno[i].media >= 7 && infAluno[i].freq >= 75)
        {
            numAprovados++;
        }

        else
        {
            numReprovados++;
        }

        i++;
    }
    fclose(arquivo);

    if (i > 0)
    {
        mediaTurma /= i;
        mediaFreqTurma /= i;

        printf("\nMédia de notas da turma: %.2f", mediaTurma);
        printf("\nMédia de frequência da turma: %.2f", mediaFreqTurma);
        printf("\nNúmero de alunos aprovados: %d", numAprovados);
        printf("\nNúmero de alunos reprovados: %d\n", numReprovados);

    }
    else
    {
        printf("Nenhum aluno encontrado no relatório!");
    }

    system("pause");

}

void sair()
{
    printf("Deseja realmente sair do programa? (S/N): ");
    getchar();
    scanf("%c", &SouN);

    switch (SouN)
    {
    case 'S':
    case 's':
        printf("\nPROGRAMA ENCERRADO!!");
        exit(1);
    case 'N':
    case 'n':
        printf("Voltando ao menu principal...\n");
        system("pause");
    }
}

 

Link para o comentário
Compartilhar em outros sites

10 horas atrás, Jpf Mito disse:

é porque é um trabalho final da faculdade, preciso criar assim

 

Não sei o que quer dizer por "assim". 

 

Não vou corrigir seu trabalho, não sei que critérios seu curso usa, nem o nível do curso que faz. Mas há diretrizes e boas práticas aceitas em toda parte, academia e mercado, e seu programa vai contra muitas delas.

 

Vai ter um trabalho do inferno pra testar e para concluir assim, e para um trabalho final não está nada bom.

 

Não postou um exemplo do arquivo texto....

 

EXEMPLOS

 

void exibeMenu()
{
    printf(
        "**************************************************"
        "***************************");
    printf(
        "\nGESTÃO DE AVALIAÇÕES - ALGORITMOS E PROGRAMAÇÃO "
        "   ");
    printf(
        "\n************************************************"
        "***************************");

    printf("\n1- Lançar avaliações e frequências");
    printf(
        "\n2- Consultar avaliações e frequências lançadas");
    printf("\n3- Gerar relatório de fechamento");
    printf("\n4- Apresentar estatísticas");
    printf("\n5- Sair do programa");
}

 

Um menu é uma função que retorna uma opção, o que o cara digitou. E não pode ser void e sem argumentos. Isso implica em uma variável global para ler as respostas, por exemplo. E não passaria numa revisão de código em uma empresa séria. E custaria pontos na nota em um curso sério.

 

        system("cls");
        exibeMenu();
        printf("\n");
        printf("\nEscolha a opção desejada: ");
        scanf("%d", &opt);

 

E depois vem isso em main(). Então tem uma função que faz uma única coisa, com flexibilidade zero. Ruim de testar. E o programa fica preso a uma variável global opt. E usa scanf() que nem foi escrita para isso e nem testa o retorno. E nem consome o '\n' que vem depois.

 

Sugiro arrumar.

 

O que quer é algo como

 

	switch( exibeMenu(opções) )
	{
		// ...
	}

 

Muito mais simples e permite usar vários menus diferentes apenas trocando o nome.

 

  • não use system. Nunca. Para nada. Está escrevendo em C. system() foi escrita em C. O sistema foi escrito em C. É proibido em toda parte.
struct alunos
{
    int   matricula;
    char  nome[80];
    int   freq;
    float notas[3];
    float media;
    char  resultado[10];
};

 

Você quer um container de alunos. Quase todos os programas para iniciantes envolvem algum tipo de container. E isso implica numa estrutura de dados, sofisticada ou minimalista que seja: um simples array, uma lista ligada, uma tabela hash, qualquer coisa. Onde está isso em seu programa?

 

Notou que a struct descreve apenas UM aluno? Porque é plural? E porque campos como matricula tem sinal? Vai operar com isso? Faz sentido uma matricula negativa? Não seria mais prático usar char? E,  se vai usar números, unsigned não seria natural?

 

Compare com isso

 

#define MAX_TURMA 40

typedef struct 
{
    int   matricula;
    char  nome[80];
    int   freq;
    float notas[3];
    float media;
    char  resultado[10];
} Aluno;

typedef struct
{
    unsigned lim; // limite de alunos
    unsigned size; // quantos tem agora
    Aluno    al[MAX_TURMA]; // os caras
} Turma;

 

E veja que uma Turma é uma coleção de Aluno. E simplifica tudo. Quase todos os exercícios para iniciantes podem ser escritos assim. Com ou sem alocação dinâmica, com listas ligadas, com hash...

 

void exibeMenu();
void lancamento();
void consulta();
void relatorio();
void estatisticas();
void sair();

 

Essas funções de nada servem assim. Tratam apenas um dado em apenas um lugar. É o mesmo que recortar e colar o código.

 

  • entenda que um prinf de várias linhas é dezenas de vezes mais rápido e esperto que vários printf de uma linha...

 

    printf("\n1- Lançar avaliações e frequências");
    printf(
        "\n2- Consultar avaliações e frequências lançadas");
    printf("\n3- Gerar relatório de fechamento");
    printf("\n4- Apresentar estatísticas");
    printf("\n5- Sair do programa");

 

Não faz sentido...

 

Compare com isso

 

    printf("\
\n\
    1- Lançar avaliações e frequências\n\
    2- Consultar avaliações e frequências lançadas\n\
    3- Gerar relatório de fechamento\n\
    4- Apresentar estatísticas\n\
    5- Sair do programa\n\
\n");

 

E considere usar puts() quando não tem variáveis. É MUITO mais rápido.

 

            while (fscanf(
                       arquivoLancamentos,
                       "%d;%[^;];%d;%f;%f;%f;%f;%s\n",
                       &infAluno[i].matricula,
                       infAluno[i].nome, &infAluno[i].freq,
                       &infAluno[i].notas[0],
                       &infAluno[i].notas[1],
                       &infAluno[i].notas[2],
                       &infAluno[i].media,
                       infAluno[i].resultado) != EOF)

 

Leia o manual.

 

Nunca teste o retorno dessas funções comparando com EOF....

 

Compare com o número de especificadores porque isso é o que elas retornam...

 

Sugiro reescrever. Leva muito menos tempo do que insistir nesse caminho.

 

Nota: dá pra ver aqui mesmo no forum que essa é uma maneira comum de escrever esses programas, e é uma pena. Não sei como se chegou a isso. Nunca fiz um curso de C, mas tem algo errado na maneira como ensinam isso [minha opinião grátis].

 

 

Poste o arquivo de entrada, ou um pequeno exemplo que permita reproduzir os testes que você faz e os problemas. E considere não usar arquivos texto e sim arquivos binários. Se for usar arquivos texto faça o simples, que é o que se faz desde os anos 70: use arquivos CSV, o popular, separando os campos por... vírgula. 

Assim pode digitar os dados no próprio IDE, se usa algum. Ou no seu editor de texto preferido....

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!