我正在编写插入这本书的功能。该函数是inslivros();.这是代码:
int inslivros()
{
char livro[30];
int categoria;
printf("Qual é o nome do livro que vai inserir?\n-> ");
gets(livro);
printf("Qual é a categoria do livro?\n1- Romance\n2- História\n-> ");
scanf("%d", &categoria);
if(categoria == 1)
{
FILE *livros;
livros = fopen("C:\Livros\inserelivros.txt", "w+");
fputs(livro, livros);
fclose(livros);
FILE *romance;
romance = fopen("C:\Livros\romance.txt", "w+");
fputs(livro, romance);
fclose(romance);
system("cls");
printf("Livro inserido com Sucesso!\n");
}
else
{
int escolha;
system("cls");
printf("Nome inválido!\n");
printf("1- Adicionar livro\n0- Voltar para o menu\n-> ");
scanf(escolha);
switch(escolha)
{
case 1:
system("cls");
inslivros();
case 2:
system("cls");
main();
}
}
}
当categoria == 1时,不会创建文件夹和文件。我哪里做错了?
当categoria == 1时,不会创建文件夹和文件。我哪里做错了?
fopen
不会为您创建文件夹/目录 - 它只创建文件。因此,如果在运行程序时C:\Livros
不存在,程序将失败。
要创建文件夹/目录,请查看mkdir
以下提议的代码:
fputs()
的调用也应该进行错误检查我将留给你使用mkdir
创建任何缺少的目录。
请记住检查mkdir
的调用是否成功,或者在第一次运行程序时是否成功,它可能成功也可能不成功。该程序的所有后续运行应该看到mkdir
失败。
现在建议的代码:
#include <stdio.h> // perror(), printf(), fprintf(),
// fgets(), fputs(),
// fopen(), fclose()
#include <stdlib.h> // system(), exit(), EXIT_FAILURE
#include <string.h> // strlen(), strchr()
#define MAX_NOME_LEN 30
// prototypes
void inslivros( void );
int main( void )
{
int escolha = 1;
system("cls");
while( escolha )
{
printf("1- Adicionar livro\n"
"0- Voltar para o menu\n-> ");
if( 1 != scanf( "%d", &escolha) )
{
fprintf( stderr, "scanf for escolha failed\n" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
switch(escolha)
{
case 1:
inslivros();
break;
case 0:
puts( "exiting" );
break;
default: // user entered an invalid menu selection
puts( "invalid menu selection, try again" );
break;
} // end switch()
} // end while()
} // end function: main
void inslivros()
{
char livro[ MAX_NOME_LEN ];
int categoria;
printf( "Qual é o nome do livro que vai inserir?\n-> " );
//gets(livro);
if( ! fgets( livro, sizeof livro, stdin ) )
{
perror( "fgets for line to insert failed" );
exit( EXIT_FAILURE );
}
// implied else, fgets successful
// remove trailing newline
char * newline;
if( (newline = strchr( livro, '\n' ) ) )
{
*newline = '\0';
}
printf( "Qual é a categoria do livro?\n"
"1- Romance\n"
"2- História\n-> " );
if( 1 != scanf("%d", &categoria) )
{
fprintf( stderr, "scanf to input the 'categoria' failed\n" );
exit( EXIT_FAILURE );
}
//implied else, scanf successful
FILE *livros = NULL;
switch( categoria )
{
case 1:
if( ! (livros = fopen("C:\\Livros\\inserelivros.txt", "a") ) )
{
perror( "fopen for inserelivros.txt failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
fputs(livro, livros);
fclose(livros);
FILE *romance;
if( !(romance = fopen("C:\\Livros\\romance.txt", "a")) )
{
perror( "fopen for romance.txt failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
fputs( livro, romance );
fclose( romance );
system("cls");
printf( "Livro inserido com Sucesso!\n" );
break;
case 0:
printf( "Historia not yet implemented\n" );
break;
default:
system("cls");
//printf("Nome inválido!\n");
printf( "invalid menu selection\n" );
break;
} // end switch()
} // end function: inslivros