Ir ao conteúdo
  • Cadastre-se

C Problema com gravação de arquivo em c


Paula_Fabiana

Posts recomendados

 for(i=0; i<strlen(x);i++){

    fprintf(arq,x.Pessoa.nome );
    fprintf(arq, "\n");     
    fprintf(arq,x.Pessoa.idade );
    }

Minha dúvida é como colocar no argumento dentro do for, porque quando é apenas uma linha posso colocar o  i<strlen(x), mas quero gravar nome e idade. Como fazer 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas 

/*Faça um programa que armazene em um registro de dados (estrutura composta) os
dados de um funcionário de uma empresa, compostos de: Nome, Idade, Sexo (M/F),
CPF, Data de Nascimento, Código do Setor onde trabalha (0-99), Cargo que ocupa
(string de até 30 caracteres) e Salário. Os dados devem ser digitados pelo usuário,
armazenados na estrutura e exibidos na tela.*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

struct pessoa {
    char nome[50];
    int idade;
    char sexo;
    unsigned long int cpf;
    char dataNas[15];

};

typedef struct funcionario {
    char cep[15];
    char cargo[30];
    float salario;
    struct pessoa Pessoa;

} Funcionario;

int main() {
    setlocale(LC_ALL, "portuguese");
    FILE *arq;
    arq = fopen("arquivo.txt", "a");
    if (arq == NULL) {
        printf("Erro na gravação de dados\n\n");
        system("pause");
        exit(1);
    }
    int n, i;
    printf("Digite qnts funcionarios gostaria de inserir: ");
    scanf("%d", &n);
    Funcionario x[n];
    for (i = 0; i < n; i++) {
        getchar();
        printf("Nome: ");
        fgets(x[i].Pessoa.nome, 50, stdin);
        printf("Idade: ");
        scanf("%d", &x[i].Pessoa.idade);
        printf("Sexo(F/M): ");
        scanf("%s", &x[i].Pessoa.sexo);
        printf("CPF: ");
        scanf("%d", &x[i].Pessoa.cpf);
        printf("DataNascimento (ddmmaaa):");
        scanf("%s", &x[i].Pessoa.dataNas);
        printf("CEP: (00000000): ");
        scanf("%s", &x[i].cep);
        printf("Cargo: ");
        scanf("%s", &x[i].cargo);
        printf("Salário: ");
        scanf("%f", &x[i].salario);

    }
    printf("\n----DADOS---\n");

    for (i = 0; i < n; i++) {
        printf("Nome: %s", x[i].Pessoa.nome);
        printf("Idade: %d", x[i].Pessoa.idade);
        printf("\nSexo: %c", toupper(x[i].Pessoa.sexo));
        printf("\nCPF: %ld", x[i].Pessoa.cpf);
        printf("\nDataNascimento: %s", x[i].Pessoa.dataNas);
        printf("\nCEP: %s", x[i].cep);
        printf("\nCargo: %s", x[i].cargo);
        printf("\nSalário: %.2f\n", x[i].salario);
        printf("------------------------------\n");
    }

    printf("\n DADOS GRAVADOS EM ARQUIVOS \n ");

      
    for (i = 0; i < strlen(x[i].Pessoa.nome); i++) {
        fprintf(arq, x[i].Pessoa.nome);
        fprintf(arq, " ; ");
    }   
    /*
    for (i = 0; i <x[i].Pessoa.idade; i++)
    fprintf(arq, " ", x[i].Pessoa.idade);  
    for (i = 0; i <strlen(x[i].Pessoa.sexo); i++)
    fprintf(arq,  x[i].Pessoa.sexo);
    for (i = 0; i <strlen(x[i].Pessoa.cpf); i++)
    fprintf(arq, " ",x[i].Pessoa.cpf);
    for (i = 0; i <strlen(x[i].Pessoa.dataNas); i++)
    fprintf(arq, x[i].Pessoa.dataNas );
    for (i = 0; i <strlen(x[i].cep); i++)
    fprintf(arq,x[i].cep );
    for (i = 0; i <strlen(x[i].cargo); i++)
    fprintf(arq,  x[i].cargo);
    for (i = 0; i <10; i++)
    fprintf(arq, "valor: R$", x[i].salario);
    //*/
    fclose(arq);
    return 0;
}

Não precisa gravar em arq, só estava tentando

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Paula_Fabiana,


A minha pergunta:

1 hora atrás, Simon Viegas disse:

X é uma vetor? isso muda toda a interpretação!

 

Sua resposta:

10 minutos atrás, Paula_Fabiana disse:

@Simon Viegas Não, era só para testar gravar mais de uma linha em arquivo, ainda sou nova em programação....mas muito  obrigada :)

 

Mas veja, de fato X é um vetor!

2 minutos atrás, Paula_Fabiana disse:

Funcionario x[n];


Vou tentar explicar o que aconteceu... Ao não usar tag CODE, o parâmetro para posição do vetor sumiu (o [i ])... veja a diferença:

 

Código da primeira postagem (sem a tag CODE):

Em 03/10/2017 às 17:13, Paula_Fabiana disse:

for(i=0; i<strlen(x);i++){
    fprintf(arq,x.Pessoa.nome );
    fprintf(arq, "\n");     
    fprintf(arq,x.Pessoa.idade );
    } 


Código da última postagem (usando a tag CODE)

5 minutos atrás, Paula_Fabiana disse:

    for (i = 0; i < strlen(x[i].Pessoa.nome); i++) {
        fprintf(arq, x[i].Pessoa.nome);
        fprintf(arq, " ; ");
    }   

 

 

Perceba que o [i ] tinha sumido.. :D

 

Devido a isso, @devair1010 interpretou errado...

7 horas atrás, devair1010 disse:

@Paula_Fabiana     seu código está certo , mas não precisa do for pois se você colocar dentro de um for os dados serão gravados varias vezes, a não ser que seja exatamente isso que você quer fazer .

Ou seja, seu código original ficou parecendo que estava escrevendo a mesma coisa várias vezes... já no código mais recente, fica claro que eram várias posições diferentes, o que já dá a entender que estava no caminho certo... (tentado escreve nomes e idades diferentes).

 

 

 

***

 

 

Aproveitando, sobre o código atual:

5 minutos atrás, Paula_Fabiana disse:

    for (i = 0; i < strlen(x[i].Pessoa.nome); i++) {
        fprintf(arq, x[i].Pessoa.nome);
        fprintf(arq, " ; ");
    }   

 

Então, o que você quer escrever no arquivo? analisando o código, entendo que quer escrever os dados dos funcionários. Logo, a quantidade de funcionários que serão escritos é justamente a quantidade de funcionários que já foram cadastrados... logo, seria algo como:

 

for (i = 0; i < n); i++) {

Ou seja, "irá escrever o funcionário da posição 0 até a posição n-1 do vetor x.

 

 

PS: apesar do algoritmo ainda está na fase de implementação e testes, a frase abaixo:

18 minutos atrás, Paula_Fabiana disse:

printf("\n DADOS GRAVADOS EM ARQUIVOS \n ");

Está fora de posição, pois o dados não foram salvos no arquivo ainda... lá, apenas "Terminou de coletar os dados", entende? essa frase deveria fica após a estrutura que está salvando do arquivo... para exemplificar melhor, a posição onde está esse texto poderia ter: "Gravando dados no arquivo". Ai gravava, e após dada a mensagem que foi gravada... ;)

 

 

No aguardo.

adicionado 2 minutos depois

ADENDO: o comando strlen(x)  serve para retornar o tamanho do vetor? então deve servi também.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Ah entendi, pois eh...eu  tentei fazer sem o vetor anteriormente, para pelo menos gravar, tentei outra vez aqui (porque tenho muitos exercícios para entregar e como não consegui, eu pulei ele ), mas continua dando errado, tipo grava o nome(string), mas para gravar os outros não esta dando certo,, nem idade , cpf... então desisti, vou arrumar mais livros para estudar arquivos, porque na net é muito vago, so mostra como gravar uma linha 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Não consigo gravar int ou float, apenas string , Tentei colocar idade, mas continua gravando só string

 

arq txt -> paula Fabiana Rosa ; paula fabiana  ;  

 for (i = 0; i < strlen(x[i].Pessoa.nome); i++) {
        fprintf(arq, x[i].Pessoa.nome);
        fprintf(arq, " ; ");
    } 
    for (i = 0; i <x[i].Pessoa.idade; i++){
    fprintf(arq, " ", x[i].Pessoa.idade);}  

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Veja, o que:
 

8 minutos atrás, Paula_Fabiana disse:

strlen(x[i].Pessoa.nome)

Significa?

 

ou seja, o for estará indo de 0 até o "tamanho do nome menos 1" (Paula tem 5 letras, logo irá de 0 a 4)... não tem nada a ver uma coisa com a outra...    mas na verdade você precisa ir de "0 a até a quantidade de funcionários menos 1". Acho que poder ser:
 

for (i = 0; i < n; i++) {

Se tenho 10 funcionários, vou de 0 a 9.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

/*Faça um programa que armazene em um registro de dados (estrutura composta) os
dados de um funcionário de uma empresa, compostos de: Nome, Idade, Sexo (M/F),
CPF, Data de Nascimento, Código do Setor onde trabalha (0-99), Cargo que ocupa
(string de até 30 caracteres) e Salário. Os dados devem ser digitados pelo usuário,
armazenados na estrutura e exibidos na tela.*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

struct pessoa {
    char nome[50];
    int idade;
    char sexo;
    unsigned long int cpf;
    char dataNas[15];

};

typedef struct funcionario {
    char cep[15];
    char cargo[30];
    float salario;
    struct pessoa Pessoa;

} Funcionario;

int main() {
    setlocale(LC_ALL, "portuguese");
    FILE *arq;
    arq = fopen("arquivo.txt", "a");
    if (arq == NULL) {
        printf("Erro na gravação de dados\n\n");
        system("pause");
        exit(1);
    }
    int n, i;
    printf("Digite qnts funcionarios gostaria de inserir: ");
    scanf("%d", &n);
    Funcionario x[n];
    for (i = 0; i < n; i++) {
        getchar();
        printf("Nome: ");
        fgets(x[i].Pessoa.nome, 50, stdin);
        printf("Idade: ");
        scanf("%d", &x[i].Pessoa.idade);
        printf("Sexo(F/M): ");
        scanf("%s", &x[i].Pessoa.sexo);
        printf("CPF: ");
        scanf("%d", &x[i].Pessoa.cpf);
        printf("DataNascimento (ddmmaaa):");
        scanf("%s", &x[i].Pessoa.dataNas);
        printf("CEP: (00000000): ");
        scanf("%s", &x[i].cep);
        printf("Cargo: ");
        scanf("%s", &x[i].cargo);
        printf("Salário: ");
        scanf("%f", &x[i].salario);

    }
    printf("\n----DADOS---\n");

    for (i = 0; i < n; i++) {
        printf("Nome: %s", x[i].Pessoa.nome);
        printf("Idade: %d", x[i].Pessoa.idade);
        printf("\nSexo: %c", toupper(x[i].Pessoa.sexo));
        printf("\nCPF: %ld", x[i].Pessoa.cpf);
        printf("\nDataNascimento: %s", x[i].Pessoa.dataNas);
        printf("\nCEP: %s", x[i].cep);
        printf("\nCargo: %s", x[i].cargo);
        printf("\nSalário: %.2f\n", x[i].salario);
        printf("------------------------------\n");
    }
 
    for (i = 0; i < n; i++) {
        fprintf(arq, x[i].Pessoa.nome);
        fprintf(arq, " ; ");
    } 
    for (i = 0; i <n; i++){
    fprintf(arq, " ", x[i].Pessoa.idade);}  
  printf("\n DADOS GRAVADOS EM ARQUIVOS \n ");
    /*
    for (i = 0; i <x[i].Pessoa.idade; i++)
    fprintf(arq, " ", x[i].Pessoa.idade);  
    for (i = 0; i <strlen(x[i].Pessoa.sexo); i++)
    fprintf(arq,  x[i].Pessoa.sexo);
    for (i = 0; i <strlen(x[i].Pessoa.cpf); i++)
    fprintf(arq, " ",x[i].Pessoa.cpf);
    for (i = 0; i <strlen(x[i].Pessoa.dataNas); i++)
    fprintf(arq, x[i].Pessoa.dataNas );
    for (i = 0; i <strlen(x[i].cep); i++)
    fprintf(arq,x[i].cep );
    for (i = 0; i <strlen(x[i].cargo); i++)
    fprintf(arq,  x[i].cargo);
    for (i = 0; i <10; i++)
    fprintf(arq, "valor: R$", x[i].salario);
    //*/
    fclose(arq);
    return 0;
}

@Simon Viegas Por enquanto eu tentei gravar só o nome e a idade, depois quero gravar o resto que esta no comentário

adicionado 5 minutos depois

@devair1010  @Simon Viegas  Ué funcionou...haha, o que o Devair falou 

 

Agora gravou, agora vou tentar colocar as outras funções, obrigada gente ;) 

arq txt-> SILVA COSTA ;  paula ;  22 

adicionado 7 minutos depois

@devair1010 e com float ? também é assim ? com "%f"

  • Curtir 1
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...