Manipulação de arquivos em C.

1. Manipulação de arquivos em C.

Gileno Cordeiro Duarte
Duarte_Gileno

(usa Outra)

Enviado em 27/07/2018 - 09:13h

Bom dia, sou estudante e estou fazendo um trabalho de manipulação de arquivos em C, tenho que criar um programa que leia determinado nome com um número na frente, exemplo: "Stark 100", já fiz uma parte, mas acontecem dois bugs diferentes.
1º Se eu escrevo "stark.txt", normal, cria um arquivo de texto, mas se escrevo apenas "Stark" cria um arquivo de texto genérico, que não é de extenção txt.
2º Preciso colocar um número na frente do arquivo, exemplo: "Stark 100" se eu colocar o número, não importa como, se eu colocar "stark 100. txt" ou apenas "Stark 100", dá bug no programa e não executa mais, agradeço muito se puderem me ajudar, segue o código:

#include<stdio.h>

void escrever();
int main(){
char nameArq[100];
int op=0;
FILE*pfile;
FILE*pfile2;
do{
printf("Digite um nome\n");
scanf("%s", nameArq);

pfile=fopen(nameArq,"w");
if(pfile){
pfile2=fopen("C:\\Users\\gilen\\Desktop\\container.txt","a" );
fputs("\n", pfile2);
fputs(nameArq, pfile2);
fputs("\n", pfile2);
}
printf("Deseja continuar criando arquivos digite 1 para sim e qualquer outro numero para nao\n");
scanf("%d", &op);
}while(op==1);

return 0;
}



  


2. Re: Manipulação de arquivos em C.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/07/2018 - 09:35h

O problema é que você está usando scanf() de forma errada. Se você quiser ler um texto que eventualmente contenha espaços, não deve usar a conversão "%s".

scanf() é uma função complexa — possivelmente a mais complexa da biblioteca padrão do C. Eu recomendo que você leia com muito cuidado sua documentação antes de a usar.

Caso você queira ler linhas inteiras, minha sugestão é que você prefira usar fgets().


3. Re: Manipulação de arquivos em C.

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 27/07/2018 - 10:36h

Duarte,

Alterei seu programa para te auxiliar.

Nesse primeira versão, forço que sempre exista a extensão .txt nos arquivos.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Função que retorna uma substring de uma string */
char* substring(char str[], int start, int end) {
int i, j;
char *sub;

/* Verifica valores incompatíveis e retorna NULL */
if(start >= end || end > strlen(str)) {
return NULL;
}

/* Aloca memória para a substring */
sub = (char *) malloc(sizeof(char) * (end - start + 1));

/* Copia a substring para a variável */
for(i = start, j = 0; i < end; i++, j++) {
sub[j] = str[i];
}

/* Terminador de string */
sub[j] = '\0';

return sub;
}

/* Fução principal so sistema */
int main() {
char nameArq[100];
char nameArq2[100];
char *extensaoAtual;
int op=0;

FILE *pfile;
FILE *pfile2;

do {
printf("Digite um nome:\n");
scanf("%s", nameArq);

/* Verificando se existe a extensão .txt
O nome deve possuir pelo menis caracteres para possuir extensão .txt
como por exemplo a.txt
*/
if (strlen(nameArq) >= 5) {
extensaoAtual = substring(nameArq, (strlen(nameArq)-4), strlen(nameArq));

/* Extensão não é .txt */
if (strcmp(".txt", extensaoAtual) != 0)
strcat(nameArq, ".txt");
}
else
strcat(nameArq, ".txt");

/* Criando o primeiro arquivo */
pfile=fopen(nameArq,"w");

if (pfile) {
printf("\nCriado o arquivo: %s\n", nameArq);

/* Nome do segundo arquivo */
//sprintf(nameArq2, "%s", "C:\\Users\\gilen\\Desktop\\container.txt");
sprintf(nameArq2, "%s", "container.txt");

/* Criando o segundo arquivo */
pfile2=fopen(nameArq2,"a");

if (pfile2) {
printf("Criado o arquivo: %s\n", nameArq2);

fputs("\n", pfile2);
fputs(nameArq, pfile2);
fputs("\n", pfile2);

/* Fechando o arquivo */
fclose(pfile2);
}
else {
printf("\nFalha ao criar o arquivo: %s\n", nameArq2);
return 1;
}

/* Fechando o arquivo */
fclose(pfile);
}
else {
printf("\nFalha ao criar o arquivo: %s\n", nameArq);
return 1;
}

/* Verificando se o usuário deseja criar mais arquivos */
printf("\nDeseja continuar criando outros arquivos?\nDigite 1 para SIM e qualquer outro numero para não.\n");
scanf("%d", &op);
} while(op==1);

return 0;
}


Veja a execcução dele.
diego@Floki:~/Scripts/Linguagem_C/arquivoNumero$ ls
criar criar2 criar2.c criar.c
diego@Floki:~/Scripts/Linguagem_C/arquivoNumero$ ./criar
Digite um nome:
arquivo100

Criado o arquivo: arquivo100.txt
Criado o arquivo: container.txt

Deseja continuar criando outros arquivos?
Digite 1 para SIM e qualquer outro numero para não.
0
diego@Floki:~/Scripts/Linguagem_C/arquivoNumero$


Nessa outra versão, não é necessário que a extensão do primeiro arquivo seja .txt.
#include <stdio.h>

/* Fução principal so sistema */
int main() {
char nameArq[100];
char nameArq2[100];
int op=0;

FILE *pfile;
FILE *pfile2;

do {
printf("Digite um nome:\n");
scanf("%s", nameArq);

/* Criando o primeiro arquivo */
pfile=fopen(nameArq,"w");

if (pfile) {
printf("\nCriado o arquivo: %s\n", nameArq);

/* Nome do segundo arquivo */
//sprintf(nameArq2, "%s", "C:\\Users\\gilen\\Desktop\\container.txt");
sprintf(nameArq2, "%s", "container.txt");

/* Criando o segundo arquivo */
pfile2=fopen(nameArq2,"a");

if (pfile2) {
printf("Criado o arquivo: %s\n", nameArq2);

fputs("\n", pfile2);
fputs(nameArq, pfile2);
fputs("\n", pfile2);

/* Fechando o arquivo */
fclose(pfile2);
}
else {
printf("\nFalha ao criar o arquivo: %s\n", nameArq2);
return 1;
}

/* Fechando o arquivo */
fclose(pfile);
}
else {
printf("\nFalha ao criar o arquivo: %s\n", nameArq);
return 1;
}

/* Verificando se o usuário deseja criar mais arquivos */
printf("\nDeseja continuar criando outros arquivos?\nDigite 1 para SIM e qualquer outro numero para não.\n");
scanf("%d", &op);
} while(op==1);

return 0;
}


Veja a execução desse outro.
diego@Floki:~/Scripts/Linguagem_C/arquivoNumero$ ls
criar criar2 criar2.c criar.c
diego@Floki:~/Scripts/Linguagem_C/arquivoNumero$ ./criar2
Digite um nome:
arquivo100

Criado o arquivo: arquivo100
Criado o arquivo: container.txt

Deseja continuar criando outros arquivos?
Digite 1 para SIM e qualquer outro numero para não.
0
diego@Floki:~/Scripts/Linguagem_C/arquivoNumero$


Abraço,
Diego M. Rodrigues


4. Re: Manipulação de arquivos em C.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/07/2018 - 11:17h

Diego,

Por favor, tome cuidado. Você não apenas não corrigiu o bug do qual ele reclamou, como também incorreu novamente numa prática que a comunidade reiteradamente não apoia, que é a de dar resposta pronta de trabalhos alheios (a própria descrição da comunidade C/C++ diz “Atenção ao fato de que a comunidade repudia práticas ilegais e antiéticas, tais como [...] atendimento de pedidos de respostas prontas a trabalhos, testes e exercícios escolares”).

Nada contra ajudar mas, por favor, preste mais atenção.

Saudações cordiais.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts