Jump to content
lsferreira

copiar, deletar e ler um ficheiro

Recommended Posts

lsferreira

Boas pessoal,

Tenho uma duvida no seguinte: tenho 3 função cada uma para ler, deletar e copiar ficheiros respetivamente:

/*lsferreira programming */
#ifndef FFILES_H_INCLUDED
#define FFILES_H_INCLUDED

#include
#include

int freadfilels() { char ch, file_name[25];
FILE *fp;
system("color 0a");
system("mode 80,10000");
printf("NAME OF FILE?: ");
gets(file_name);
system("cls");
system("color 07");
fp=fopen(file_name,"r");
if (fp==NULL) { perror("ERROR WHILE OPENING THE FILE\n");
exit(EXIT_FAILURE); }
printf("FILE &s HAVE:\n\n", file_name);
while((ch=fgetc(fp))!= EOF)
printf("%c",ch);
fclose(fp);}

int fdelfilels() { int status; char file_name[25];
printf("FILE?: ");
gets(file_name);
status = remove(file_name);
if( status == 0 )
printf("%s FILE DELETED.\n",file_name);
else
{ printf("CANT DELETE FILE\n");
perror("ERROR"); }}

int fcopyfilels() { char ch, source_file[20], target_file[20]; FILE *source, *target;
printf("FILE?: ");
gets(source_file);
source = fopen(source_file, "r");
if( source == NULL )
{printf("FILE NOT FOUNDED...\n");
exit(EXIT_FAILURE);}
printf("TARGET_FILE?: ");
gets(target_file);
target = fopen(target_file, "w");
if( target == NULL )
{fclose(source);
printf("Press any key to exit...\n");
exit(EXIT_FAILURE);}
while( ( ch = fgetc(source) ) != EOF )
fputc(ch, target);
printf("FILE COPIED.\n");
fclose(source);
fclose(target);}

#endif // FFILES_H_INCLUDED

Quando coloco o codigo a correr tenho um menu com loop infinito (deste tipo, exemplo)... :

int main(void) { system("color 0e"); while(1) { menuls(); } return 0; }
void menuls() { int choise;
system("cls");
system("color 0e");
system("mode 80,12");
printf(
"								 totalConsole\n"
"						 CommandLine Library for Windows\n\n"
" 1. MATH\n"
" 2. TOOLS\n"
" 3. OTHERS\n"
" 4. TESTS\n\n"
" 0. EXIT\n\n" );
printf("CHOISE?: ");
scanf("%d", &choise);
switch(choise)
{
case 1 : mmathls(); break;
case 2 : mtoolsls(); break;
case 3 : puts("null"); break;
case 4 : mtestsls(); break;
case 0 : exitls(); break;
default : main(); break;
}
}

void mtoolsls() { int choise;
system("cls");
system("color 0e");
system("mode 80,14");
printf(
" totalConsole\n"
" CommandLine Library for Windows\n\n"
" 1. ..\n\n"
" 2. HOURS CONVERTER\n"
" 3. SYSTEM TOOLS\n"
" 4. READ FILE\n"
" 5. DELETE FILE\n"
" 6. COPY FILE\n\n");
printf("CHOISE?: ");
scanf("%d", &choise);
switch(choise)
{
case 1 : menuls(); break;
case 2 : hoursls(); break;
case 3 : systemmls(); break;
case 4 : readfilels(); break;
case 5 : delfilels(); break;
case 6 : copyfilels(); break;
default : main(); break;
}
}

... Ele salta isto:

printf("FILE?: ");
gets(source_file);

Qual é a causa do problema? Ainda não percebi xD

Codigo do projeto completo: https://github.com/ljmf00/totalConsole

Cumps ;)

Luís Ferreira

PS: Sorry pelo spam de codigo :D

Edited by apocsantos
geshi

Share this post


Link to post
Share on other sites
HappyHippyHippo

... Ele salta isto:

printf("FILE?: ");
gets(source_file);

e onde está esse código ?

não estás à espera que as pessoas leiam linhas e linhas de código à procura de duas linhas perdidas lá pelo meio, pois não ?

ps : isto apesar de desconfiar que o problema é o mesmo problema que assombra 90% dos tópicos criados com problemas relacionados com a leitura de dados do teclado ...

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
lsferreira

e onde está esse código ?

não estás à espera que as pessoas leiam linhas e linhas de código à procura de duas linhas perdidas lá pelo meio, pois não ?

ps : isto apesar de desconfiar que o problema é o mesmo problema que assombra 90% dos tópicos criados com problemas relacionados com a leitura de dados do teclado ...

O problema esta, por exemplo nesta função:

int fcopyfilels() { char ch, source_file[20], target_file[20]; FILE *source, *target;
printf("FILE?: ");
gets(source_file);
source = fopen(source_file, "r");
if( source == NULL )
{printf("FILE NOT FOUNDED...\n");
exit(EXIT_FAILURE);}
printf("TARGET_FILE?: ");
gets(target_file);
target = fopen(target_file, "w");
if( target == NULL )
{fclose(source);
printf("Press any key to exit...\n");
exit(EXIT_FAILURE);}
while( ( ch = fgetc(source) ) != EOF )
fputc(ch, target);
printf("FILE COPIED.\n");
fclose(source);
fclose(target);}

Ao correr este codigo a seguinte linha é passada ao lado:

gets(source_file);

Edited by lsferreira

Share this post


Link to post
Share on other sites
HappyHippyHippo

ps : isto apesar de desconfiar que o problema é o mesmo problema que assombra 90% dos tópicos criados com problemas relacionados com a leitura de dados do teclado ...

vais fazer isto:

- esquecer que existe a função gets (nunca deveria ter sido criada)

- alterar doas as chamadas da função gets por uma chamada equivalente da chamada fgets (altera o que tiveres de alterar)

- voltas a esquecer da existência da função gets

- sempre que lês os dados do teclado recorrendo à família de funções *scanf, limpa o buffer de entrada (da maneira que bem te apetecer)

- pelo última vez, voltas a esquecer da existência da função gets


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
lsferreira

vais fazer isto:

- esquecer que existe a função gets (nunca deveria ter sido criada)

- alterar doas as chamadas da função gets por uma chamada equivalente da chamada fgets (altera o que tiveres de alterar)

- voltas a esquecer da existência da função gets

- sempre que lês os dados do teclado recorrendo à família de funções *scanf, limpa o buffer de entrada (da maneira que bem te apetecer)

- pelo última vez, voltas a esquecer da existência da função gets

Boas,

Obrigado, resolvi o problema em trocar a função gets() pela função scanf().

Só não percebo porque é que se eu correr o codigo como função principal, main() ele faz tudo direitinho, :o.

Cumps ;)

Luís Ferreira

Share this post


Link to post
Share on other sites
p0dr0x

Ola amigo, me registrei para falar, utilize

fflush(stdin); no windows.

__fpurge(stdin); no linux.

É sempre bom utilizar antes de scanf ou gets.

Como o hippo falou, isso é relacionado a "limpeza do buffer de leitura".

int fcopyfilels() { char ch, source_file[20], target_file[20]; FILE *source, *target;

printf("FILE?: ");

fflush(stdin);

gets(source_file);

source = fopen(source_file, "r");

if( source == NULL )

{printf("FILE NOT FOUNDED...\n");

exit(EXIT_FAILURE);}

printf("TARGET_FILE?: ");

fflush(stdin);

gets(target_file);

target = fopen(target_file, "w");

if( target == NULL )

{fclose(source);

printf("Press any key to exit...\n");

exit(EXIT_FAILURE);}

while( ( ch = fgetc(source) ) != EOF )

fputc(ch, target);

printf("FILE COPIED.\n");

fclose(source);

fclose(target);}

acredito que dará certo.

Edited by p0dr0x

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.