2017-12-19 8 views
-3

私は 関数を書いて本を挿入しています。この関数はinslivros()です。C FILEの作成が機能しない

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の場合、フォルダとファイルは作成されていません。どこで私は間違えましたか?

+0

コメントは、拡張された議論のためではありません。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/161535/discussion-on-question-by-rodrigo-silva-c-file-creation-not-working)。 – Andy

+0

ディレクトリパスを作成する必要がある場合は、[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ではスラッシュを処理していますが、従来はバックスラッシュを使用しています。 –

答えて

2

カテゴリ== 1の場合、フォルダとファイルが作成されていません。どこで私は間違えましたか?

fopenあなたのためのフォルダ/ディレクトリは作成されません。ファイルは作成されるだけです。したがって、プログラムの実行中にC:\Livrosが存在しない場合、プログラムは失敗します。 mkdir

+0

ありがとう!私の悪い、申し訳ありません。 –

0

で次のように提案されているコードのフォルダ/ディレクトリの外観を作成するため

  1. は質問
  2. へのコメントのほとんどを実装して再帰
  3. が追加継続するという決定を分離回避新しいエントリの実際の追加からのエントリ。
  4. はきれい
  5. 各ヘッダファイルが
  6. 警告が含まれている理由を文書にコンパイル:ほとんどの項目が適切にチェックされているエラーを。しかし、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 
関連する問題