Ir ao conteúdo

C Ler arquivos de texto em C


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

Boa tarde a todos!

Galera, eu estava estudano como ler um arquivo de texto em C. Para isso, eu criei um arquivo com o bloco de notas e salvei na minha área de trabalho.

Então eu fiz o seguinte código:

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

int main()
{
   FILE *t;
   t = fopen("stringteste.txt", "r");

   char texto[100];

   while(fgets(texto,100,t) != NULL)
   {
       printf("%s",texto);
   }
   fclose(t);
    return 0;
}

O programa compila, mas não a parece a mensagem que escrevi, mas aparece isso:

image.png.675791871eb95586a9eadcf4cfd95d08.png

Então pense que talvez o ndereço do meu arquivo estaria escrito errado no código. Fui no arquivo, copiei o endereço dele e coloquei dentro do "fopen":

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

int main()
{
   FILE *t;
   t = fopen("C:\Users\well\Desktop\stringteste.txt", "r");

   char texto[100];

   while(fgets(texto,100,t) != NULL)
   {
       printf("%s",texto);
   }
   fclose(t);
    return 0;
}

Nesse caso apareceu uma mensagem de erro.

image.png.46de51ea802e5dd9b679ce521345ce44.png

Então, não consigo perceber meu erro.

Desde ja agradeço a ajuda de vocês.

OBS: O nome do meu arquivo de texto é:

image.png.258811105f5bc91fdd8390fc642391b6.png

Postado

@Lucca Rodrigues Mano, eu não mudei o diretório. Eu apenas peguei o arquivo em txt e coloquei dentro da pasta do programa do codeblock. Aí abriu normalmente.

:)

Mas agora que você falou das duas barras, eu aprendi a colocar o diretório.

  • Curtir 1
Postado

image.png.18e26309607e79ed559a5e3aa10369cc.png

 

 

 

 

@Lucca Rodrigues

 

Para compilar C use um arquivo .c 

 

No melhor dos casos não vai fazer diferença, mas nem todo caso é o melhor. Há muitas diferenças em termos de declarações, palavras chave e inicialização por exemplo e quando der um problema pode ser díficil de achar a razão porque vai estar procurando em outro lugar
 

@PenseC

 

FILE *t;
t = fopen("C:\Users\well\Desktop\stringteste.txt", "r");

 

  • não há razão para declarar isso em duas linhas
  • Está declarando t. Qual o tipo de t? t é FILE*. Declare como tal. Se está aprendendo evite esse vício de deixar asteriscos do lado direito da declaração. É claro que se t é FILE* *t é FILE. É a definição da linguagem. Mas esá declarando t. Prefira sempre em uma linha só:
     
        FILE* t = fopen("stringteste.txt", "r");

De volta ao comando: Veja esse printf()
 

	printf("\nteste\tvalor1\tvalor2\x33\n");


Ele mostra
 

teste   valor1  valor23

 

Ou seja: 

  • pula uma linha devido ao '\n'
  • escreve teste
  • pula para a próxima tabulação, aqui 8 colunas, devido ao '\t'
  • escreve valor1
  • pula para a próxima tabulação, mais 8 colunas, devido ao outro '\t'
  • escreve valor2
  • escreve 3 porque \x33 é o valor 33 em hexa, 51 em decimal, e é o "3"
  • pula uma linha devido ao '\n'

Ou seja: printf() entende de modo especial o n e o t depois de uma barra invertida...

 

E aí vem a sua linha
 

t = fopen("C:\Users\well\Desktop\stringteste.txt", "r");

 

E é a mesma coisa: a barra invertida indica que o próximo caracter é algo diferente

  • \U é o prefixo para uma constante Unicode
    Veja no Windows 10
    image.png.06c4a84dae177e90374dd01b6f615717.png
  • Pois é....

\U + 1D5F como aparece aqui no fim gera uma letra grega, um delta minúsculo tão caro aos matemáticos :)

 

Só que no seu programa veio \User e isso não é um codepoint válido Unicode, já que nem são valores hexadecimais....

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E o compilador explicou:

 

image.png.c8dcc777fe6aec62fe8f558ecdfe67af.png

 

Os outros dois, w e s não tem significado especial e assim o compilador só disse que é uma sequência de escape inválida. Essas coisas são conhecidas como escape sequences...

 

Em 03/12/2020 às 12:37, Lucca Rodrigues disse:

Caso você queira inserir o diretório completo, são 2 barras em vez de apenas 1, então esse diretório aí seria algo como: "C:\\Users\\well\\Desktop\\stringteste.txt"

 

É verdade mas não é: não tem a ver com o diretório completo, apenas com o fato de que a barra invertida tem um significado especial, inicial uma sequência de escape, e para mostrar uma barra invertida você SEMPRE usa duas. Mesmo caso do "%" em printf(): para mostrar um se escreve dois.

 

C e os nomes de arquivo:

 

Entenda que tanto faz escrever
 

    FILE* t = NULL;

    t = fopen("teste/stringteste.txt", "r");
    t = fopen("teste\\stringteste.txt", "r");

 

E entenda que o nome do arquivo deveria vir CLARO na linha de comando. Não faz sentido o nome do arquivo estar fixo dentro do programa. Vai compilar o programa cada vez que for mudar o nome de arquivo? Uma constante? 

 

1 hora atrás, PenseC disse:

Mas agora que você falou das duas barras, eu aprendi a colocar o diretório.

 

Entenda que isso nada tem a ver com o diretório. É C. Ou C++. Ou java... Muitas linguagens usam a barra invertida de odo particular, assim como aspas e '%' por exemplo...

 

Não use o nome completo do arquivo. Só vai dar problema. Muito menos a letra do volume. E use a linha de comando para passar o nome do arquivo

image.png

  • Curtir 1
  • Obrigado 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!