C文件创建无法正常工作[关闭]

问题描述 投票:-3回答:2

我正在编写插入这本书的功能。该函数是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时,不会创建文件夹和文件。我哪里做错了?

c file fopen
2个回答
2
投票

当categoria == 1时,不会创建文件夹和文件。我哪里做错了?

fopen不会为您创建文件夹/目录 - 它只创建文件。因此,如果在运行程序时C:\Livros不存在,程序将失败。

要创建文件夹/目录,请查看mkdir


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
© www.soinside.com 2019 - 2024. All rights reserved.