で次のように提案されているコードのフォルダ/ディレクトリの外観を作成するため
:
- は質問
- へのコメントのほとんどを実装して再帰
- が追加継続するという決定を分離回避新しいエントリの実際の追加からのエントリ。
- はきれい
- 各ヘッダファイルが
- 警告が含まれている理由を文書にコンパイル:ほとんどの項目が適切にチェックされているエラーを。しかし、
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
コメントは、拡張された議論のためではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/161535/discussion-on-question-by-rodrigo-silva-c-file-creation-not-working)。 – Andy
ディレクトリパスを作成する必要がある場合は、[C++/Linuxでディレクトリtreinを作成するにはどうすればいいですか?](https://stackoverflow.com/questions/675039/how-can-i-create-directory- tree-in-c-linux/675193#675193)答えはCとC++の両方のコードです。 'mkdir()'システムコールを使用し、パス区切り文字を除いてWIndows上でOKを実行する必要があります(Windowsではスラッシュを処理していますが、従来はバックスラッシュを使用しています。 –