Ir ao conteúdo
  • Cadastre-se

C Eu estou a tentar fazer um programa com um arquivo de texto (.txt)


Posts recomendados

Eu estou a tentar fazer um programa com um arquivo de texto (.txt) mas cada que ele tem de escrever (Disciplina: (nome da disciplina), mas cada vez faço run ele em vez de escrever por exemplo (Disciplina: Arquitetura de Computadores), ele escrever (Disciplina: Aquitetura (enter) Disciplina: de (enter) Disciplina: Computadores) alguém me pode ajudar?

 

image.png.b476d75ebe68d1ac45e0ce9b8e188922.png

 

 

image.png.48b8bec609d7592d860fe24c7503c6b7.png

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

@João Silvestre    o fscanf só lê uma palavra de cada vez , ou mais se eles estiverem unidas por um underline , mas para a leitura quando encontra um espaço , e para ler uma linha inteira use o fgets , e seu código com o fscanf ficaria assim  :

#include <stdio.h>
#include <stdlib.h>
int main(){
    char nome_fich[30],nome[30],
         disciplina[30]        ;
    FILE *pnt_fich             ;
    int num_campos = 0         ;
    printf("Nome do Ficheiro a Ler "         );
    scanf("%s",nome_fich                     );
    pnt_fich = fopen("NomeDisciplina.txt","r");
    if(pnt_fich == 0                         ){
        printf("O Arquivo Nao Existe !\n"    );
        system("pause"                       );
        return 32768                          ;
    }
    while(fscanf(pnt_fich,"%s",nome) != EOF  ){
        printf("%s\n",nome                   );
        num_campos++                          ;
    }
    fclose(pnt_fich                          );
    system("pause"                           );
    printf("\n\n\n"                          );
    return 0                                  ;
}

 

Link para o comentário
Compartilhar em outros sites

14 minutos atrás, devair1010 disse:

@João Silvestre    o fscanf só lê uma palavra de cada vez , ou mais se eles estiverem unidas por um underline , mas para a leitura quando encontra um espaço , e para ler uma linha inteira use o fgets , e seu código com o fscanf ficaria assim  :


#include <stdio.h>
  #include <conio.h>
#include <stdlib.h>
int main(){
    char nome_fich[30],disciplina[30],
         nome[30];
    FILE *pnt_fich;
    int num_campos=0;
    printf("Nome do Ficheiro a Ler ");
    scanf("%s",nome_fich);
    pnt_fich = fopen("NomeDisciplina.txt","r");
    if(pnt_fich == 0 ) return 0;
    while(fscanf(pnt_fich,"%s",nome) != EOF)
        printf("%s\n",nome);
    fclose(pnt_fich);
    while( ! kbhit() );
    printf("\n\n\n");
    return 0;
}

 

O programa agora não faz nada, ele abre pede o ficheiro e fecha.

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

Seu programa não está nada bom.

 

1 hora atrás, João Silvestre disse:

#include <conio.h>

 

Tire isso de seu programa. Isso é --- sério --- dos anos 80 --- e não é possível que precise de algo que tenha aí e não tenha na linguagem, porque mesmo nos 80 não era assim importante. Eu usava...

 

1 hora atrás, João Silvestre disse:

printf("Nome do Ficheiro a Ler ");
scanf("%s",nome_fich);
pnt_fich = fopen("NomeDisciplina.txt","r");

 

Se está aprendendo, se acostume a imediatamente imprimir o que leu, para se sentir seguro do que está havendo. A menos que saiba usar o debugger, claro.

 

Pra que perguntou o nome do arquivo para abrir outro a partir de um literal, o nome FIXO?

 

1 hora atrás, João Silvestre disse:

if(pnt_fich == 0 ) return 0;

 

Não, não retorne zero. Tudo menos zero. Você está perdendo a oportunidade óbvia de saber que seu programa saiu por aí. Todos os programas retornam zero. Retorne -523 por exemplo e saberá que não conseguiu abrir o arquivo quando for o caso

 

1 hora atrás, João Silvestre disse:

while(fscanf(pnt_fich,"%s",nome) != EOF)

 

@devair1010 te disse: não use scanf(). Essas funções não foram escritas para isso. Você pode usar, mas é bobagem. Faça o simples e use fgets().

 

1 hora atrás, João Silvestre disse:

while( ! kbhit() );

 

  • Você não precisa disso. Se usa isso para parar o programa porque só roda o programa dentro do IDE --- sim, IDE é masculino e não feminino --- tem dois problemas: não devia fazer isso porque o ambiente de teste dentro do IDE não é o mesmo da execução normal do programa e não vai saber se ele de fato funciona e ele pode falhar num sistema de teste automatizado ou no computador do professor
  • Seu IDE por certo tem um comando óbvio para não fechar a janela ao programa terminar. Uma configuração só para todos os seus programas

 

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

@João Silvestre      parece me que você salvou o arquivo como o nome (  NomeDisciplina.txt  )  , aí esse nome é diferente desse aqui  (   NomeDisciplina   )  que é o que o programa vai detectar  na hora de ler ele ,  então aquele primeiro depois que você salvou fica assim  (   NomeDisciplina.txt.txt   )  e ele não encontra um arquivo com esse nome aí ele sai do programa como está na linha 12 , print do nome do arquivo aqui e veja que não aparece txt no nome   :

e aqui testei ele e está funcionando bem .

174691631_arquivotxt.thumb.jpg.3a4c08323c48e6e812d06c49ae500957.jpg

Link para o comentário
Compartilhar em outros sites

12 minutos atrás, devair1010 disse:

como usa esse novo fscanf 

 

3 horas atrás, Mauro Britivaldo disse:

Assim: " %[^\n]", nesse caso o ENTER é nosso separador.

while(fscanf(pnt_fich,"%[\n]",nome) != EOF 

Há uma certa diferença aí, @devair1010 : Você sumiu com o '^'

 

Esse especificador para scanf(), "%[ ]" é uma lista de caracteres. E se o primeiro for um ^ indica a negativa da lista. E é assim desde os tempos em que scanf() ficava no /usr/bin da máquina do K. Thompson no final dos 60 --- acho que foi ele que escreveu a primeira versão. É uma parte de uma expressão regular.

 

Então %[cdef] aceita apenas cdef e %[^cdef] aceita qualquer coisa exceto cdef

 

Veja com atenção esse exemplo de saída do programa que está abaixo
 

string: 'ssdsdaaagffgf23234b344cc'
especificador '%[^abcd]%[ad]'

sscanf() retornou 2
        a: 'ss'
        b: 'd'

string: 'ssdsdaaagffgf23234b344cc'
especificador '%[^abcd]d%[^f]'

sscanf() retornou 2
        a: 'ss'
        b: 'sdaaag'

Cada scanf() usa a mesma entrada e tenta ler 'a' e 'b'

  • no primeiro caso aceita aceita tudo exceto abcd então consome ss e para no d
  • depois aceita apenas ad mas vem um d logo a seguir então consegue ler a e b e retorna 2
  • no segundo caso a coisa mudou: ele aceita tudo exceto abcd então para no d
  • depois vem o d sozinho e scanf() pula o d. O 'd' sózinho lá é ativo!!!
  • depois vem o [ ^f] e scanf() consome tudo até o f

Assim também fica mais um exemplo do porque eu sempre aviso para ler o retorno de scanf(). 
E não para comparar com EOF como está no programa do autor, mas sim com a quantia de especificadores, como os dois aqui no exemplo. 

Porque é muito possível que scanf() só leia alguns. Ou nenhum. Ou mesmo retorne algo <0 que será o EOF. Então entenda que não testar é ingenuidade, mas testar por EOF apenas não acrescenta muito...

 

 scanf() não foi feita para ler valores do teclado. Foi escrita para ler entrada formatada. Por isso tem esse nome. Por isso tem esse comportamento. Eu sempre explico isso em todo lugar. Evite usar isso para ler do teclado. É muito difícil de controlar. Leia uma linha ou uma letra, via fgetc() ou fgets() e terá uma vida mais tranquila.
 

O teste

#define _CRT_SECURE_NO_WARNINGS

#include "stdio.h"
#include "stdlib.h"


int main()
{

    const char* exemplo = "ssdsdaaagffgf23234b344cc";
    const char* formato1 = "%[^abcd]%[ad]";
    const char* formato2 = "%[^abcd]d%[^f]";
    int n = 0;
    char a[30];
    char b[30];
    char buffer[80];

    printf("\nstring: '%s'\nespecificador '%s'\n\n",
        exemplo, formato1);
    n = sscanf(exemplo, formato1, a, b);
    printf("sscanf() retornou %d\n", n);
    if (n > 0) printf("\ta: '%s'\n", a);
    if (n > 1) printf("\ta: '%s'\n", b);
    
    printf("\nstring: '%s'\nespecificador '%s'\n\n",
        exemplo, formato2);
    n = sscanf(exemplo, formato2, a, b);
    printf("sscanf() retornou %d\n", n);
    if (n > 0) printf("\ta: '%s'\n", a);
    if (n > 1) printf("\ta: '%s'\n", b);

    return 0;
};  // main()

 

  • Obrigado 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...