C 文件创建不起作用
C FILE creation not working
我正在写
插书功能。函数是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 时,不创建文件夹和文件。我哪里错了?
When categoria == 1, the folder and file are not being created. Where did I go wrong?
fopen
不会为您创建 folders/directories - 它只会创建文件。所以如果运行程序时C:\Livros
不存在,程序就会失败。
要创建 folder/directory 查看 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 = '[=10=]';
}
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
我正在写 插书功能。函数是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 时,不创建文件夹和文件。我哪里错了?
When categoria == 1, the folder and file are not being created. Where did I go wrong?
fopen
不会为您创建 folders/directories - 它只会创建文件。所以如果运行程序时C:\Livros
不存在,程序就会失败。
要创建 folder/directory 查看 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 = '[=10=]';
}
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