Sobre o fopen(); [RESOLVIDO]

1. Sobre o fopen(); [RESOLVIDO]

Jhevi
Jhevison

(usa Arch Linux)

Enviado em 01/11/2019 - 15:49h

Bom, ainda estou aprendendo sobre C, então qualquer erro me desculpem. Me corrijam se possível.
Então eu estou fazendo um pequeno editor de texto(para uso próprio). Estou utilizando a função "fopen();", queria saber se há alguma maneira de fazer com que eu dentro do programa próprio selecione o nome do arquivo, por exemplo:

Selecione o nome do arquivo:
- texto.txt
- arquivo salvo!

Ou seja, sem eu ter que abrir o programa e digitar lá na função fopen("texto.txt", "w"); e sim da forma que dei o exemplo ali acima.

Se há alguma outra função, ou outra forma de solucionar isso, podem argumentar aí; já que o fopen aceita apenas 2 argumentos.


  


2. Re: Sobre o fopen(); [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/11/2019 - 19:48h

Sim. O primeiro argumento (e o segundo também) pode ser qualquer coisa que possa ser entendida como um ponteiro para caracteres constantes válido (i.e. aponte para um endereço não-nulo e que esteja no espaço endereçável do programa) e cujo conteúdo seja uma string (uma sequência com zero ou mais caracteres não-nulos seguida por um byte nulo).

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

int main(void){
int n_erros=0;

char arq1[]="arq1.txt"; // String; tamanho 9 calculado implicitamente (8 não-nulos mais o byte nulo).
char arq2[9]="arq2.txt"; // String; tamanho explícito 9 (8 não-nulos mais o byte nulo).
char arq3[8]="arq3.txt"; // Não é string, pois falta espaço para o byte nulo, e o C o suprime (em C++, isso seria um erro).
char arq4[9]={'a', 'r', 'q', '4', '.', 't', 'x', 't', 0}; // String, definida caráter a caráter, mas incluindo o byte nulo.
const char arq5[]="arq5.txt"; // String constante; tamanho calculado automaticamente.
const char *arq6="arq6.txt"; // Ponteiro para string literal constante.
const char *const arq7="arq7.txt"; // Ponteiro constante para string literal constante;
char *arq8=NULL;
size_t tam_arq8=0;
printf("Digite o nome do arquivo: ");
ssize_t usado_arq8=getline(&arq8, &tam_arq8, stdin);
if(usado_arq8==-1){
fprintf(stderr, "Nome de arquivo inválido.\n");
goto fim;
}
else if(usado_arq8>0 && arq8[usado_arq8]=='\n')
arq8[usado_arq--]='\0';
char c9='a'; // É possível obter o endereço de c9, que é um ponteiro para caracteres, mas ele só conteria uma string válida se o valor de c9 fosse nulo, o que, por sua vez, implicaria uma string vazia, o que possivelmente não seria um nome de arquivo válido.
const char c10='a'; // É possível obter o endreço de c10, que é um ponteiro para caracteres constantes, mas ele só conteria uma string válida se o valor de c10 fosse nulo, o que, por sua vez, implicaria uma string vazia, o que possivelmente não seria um nome de arquivo válido.

FILE *f[12];
f[0]=fopen("arq0.txt", "r"); // Usa constante literal string (array de caracteres constantes com 9 bytes de comprimento, convertida implicitamente por decaimento em ponteiro para caracteres um (NÃO-constantes, o que, na minha opinião, é um defeito do C, mas isso foi deliberado para ser assim pelo comitê que padronizou a linguagem; em C++ seria decaimento para ponteiro de caracteres constantes)).
f[1]=fopen(arq1, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres).
f[2]=fopen(arq2, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres).
f[3]=fopen(arq3, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres), MAS PODE TER EFEITO CATASTRÓFICO porque esse array não contém uma string válida, já que falta o byte nulo.
f[4]=fopen(arq4, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres).
f[5]=fopen(arq5, "r"); // Usa array de caracteres constantes (convertida implicitamente por decaimento em ponteiro para caracteres constantes).
f[6]=fopen(arq6, "r"); // Usa ponteiro para caracteres constantes (nenhuma conversão).
f[7]=fopen(arq7, "r"); // Usa ponteiro para caracteres constantes (nenhuma conversão, mas como o argumento é sempre uma cópia, o fato do próprio ponteiro ser constante (e não apenas o conteúdo para o qual ele aponta) não faz diferença).
f[8]=fopen(arq8, "r"); // Usa ponteiro para caracteres (nenhuma conversão).
f[9]=fopen(&c9, "r"); // Obtém endereço do caráter, cujo tipo é ponteiro para caracteres, MAS PODE TER EFEITO CATASTRÓFICO porque não se terá uma string válida).
f[10]=fopen(&c10, "r"); // Obtém endereço do caráter, cujo tipo é ponteiro para caracteres constantes, MAS PODE TER EFEITO CATASTRÓFICO porque não se terá uma string válida).
f[11]=fopen(NULL, "r"); // Usa ponteiro para caracteres (conversão implícita a partir de “void *” ou do valor inteiro 0), MAS PODE TER EFEITO CATASTRÓFICO porque o ponteiro não é válido.

/* Usa f[...]. */

fim:
free(arq8); // Libera a memória alocada para ler o nome de um dos arquivos.
return n_erros;
}



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: Sobre o fopen(); [RESOLVIDO]

Jhevi
Jhevison

(usa Arch Linux)

Enviado em 02/11/2019 - 00:59h

paulo1205 escreveu:

Sim. O primeiro argumento (e o segundo também) pode ser qualquer coisa que possa ser entendida como um ponteiro para caracteres constantes válido (i.e. aponte para um endereço não-nulo e que esteja no espaço endereçável do programa) e cujo conteúdo seja uma string (uma sequência com zero ou mais caracteres não-nulos seguida por um byte nulo).

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

int main(void){
int n_erros=0;

char arq1[]="arq1.txt"; // String; tamanho 9 calculado implicitamente (8 não-nulos mais o byte nulo).
char arq2[9]="arq2.txt"; // String; tamanho explícito 9 (8 não-nulos mais o byte nulo).
char arq3[8]="arq3.txt"; // Não é string, pois falta espaço para o byte nulo, e o C o suprime (em C++, isso seria um erro).
char arq4[9]={'a', 'r', 'q', '4', '.', 't', 'x', 't', 0}; // String, definida caráter a caráter, mas incluindo o byte nulo.
const char arq5[]="arq5.txt"; // String constante; tamanho calculado automaticamente.
const char *arq6="arq6.txt"; // Ponteiro para string literal constante.
const char *const arq7="arq7.txt"; // Ponteiro constante para string literal constante;
char *arq8=NULL;
size_t tam_arq8=0;
printf("Digite o nome do arquivo: ");
ssize_t usado_arq8=getline(&arq8, &tam_arq8, stdin);
if(usado_arq8==-1){
fprintf(stderr, "Nome de arquivo inválido.\n");
goto fim;
}
else if(usado_arq8>0 && arq8[usado_arq8]=='\n')
arq8[usado_arq--]='\0';
char c9='a'; // É possível obter o endereço de c9, que é um ponteiro para caracteres, mas ele só conteria uma string válida se o valor de c9 fosse nulo, o que, por sua vez, implicaria uma string vazia, o que possivelmente não seria um nome de arquivo válido.
const char c10='a'; // É possível obter o endreço de c10, que é um ponteiro para caracteres constantes, mas ele só conteria uma string válida se o valor de c10 fosse nulo, o que, por sua vez, implicaria uma string vazia, o que possivelmente não seria um nome de arquivo válido.

FILE *f[12];
f[0]=fopen("arq0.txt", "r"); // Usa constante literal string (array de caracteres constantes com 9 bytes de comprimento, convertida implicitamente por decaimento em ponteiro para caracteres um (NÃO-constantes, o que, na minha opinião, é um defeito do C, mas isso foi deliberado para ser assim pelo comitê que padronizou a linguagem; em C++ seria decaimento para ponteiro de caracteres constantes)).
f[1]=fopen(arq1, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres).
f[2]=fopen(arq2, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres).
f[3]=fopen(arq3, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres), MAS PODE TER EFEITO CATASTRÓFICO porque esse array não contém uma string válida, já que falta o byte nulo.
f[4]=fopen(arq4, "r"); // Usa array de caracteres (convertida implicitamente por decaimento em ponteiro para caracteres).
f[5]=fopen(arq5, "r"); // Usa array de caracteres constantes (convertida implicitamente por decaimento em ponteiro para caracteres constantes).
f[6]=fopen(arq6, "r"); // Usa ponteiro para caracteres constantes (nenhuma conversão).
f[7]=fopen(arq7, "r"); // Usa ponteiro para caracteres constantes (nenhuma conversão, mas como o argumento é sempre uma cópia, o fato do próprio ponteiro ser constante (e não apenas o conteúdo para o qual ele aponta) não faz diferença).
f[8]=fopen(arq8, "r"); // Usa ponteiro para caracteres (nenhuma conversão).
f[9]=fopen(&c9, "r"); // Obtém endereço do caráter, cujo tipo é ponteiro para caracteres, MAS PODE TER EFEITO CATASTRÓFICO porque não se terá uma string válida).
f[10]=fopen(&c10, "r"); // Obtém endereço do caráter, cujo tipo é ponteiro para caracteres constantes, MAS PODE TER EFEITO CATASTRÓFICO porque não se terá uma string válida).
f[11]=fopen(NULL, "r"); // Usa ponteiro para caracteres (conversão implícita a partir de “void *” ou do valor inteiro 0), MAS PODE TER EFEITO CATASTRÓFICO porque o ponteiro não é válido.

/* Usa f[...]. */

fim:
free(arq8); // Libera a memória alocada para ler o nome de um dos arquivos.
return n_erros;
}



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



Obrigado por sempre responder minhas duvidas, Deus te abençoe.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts