这代码写完,我差不多就已经不认识了。
											题目:写一个图书管理程序,要求可以增加记录,读取记录,删除记录,修改记录。我从11点半写到1点半,然后越写越觉得这代码写的可真蠢。
程序代码:#include <stdio.h>
#include <stdlib.h>
typedef struct {
                 char title[50];
                 char author[50];
                 float value;
                 int del_tag;
               }BOOKS;
void menu(void);
void f_read(void);
void data_add(void);
void data_delete(void);
FILE * f_open(void);
void f_write(BOOKS a[], int arrays);
long int datas = 0;
int main(void)
{
    typedef void(*P_FUN)(void);
    P_FUN fun_M[3] = { f_read,data_delete,data_add };
    int option = 0;
    FILE *p_file;
    p_file = f_open();
    fclose(p_file);
    while (menu(), scanf("%d", &option) == 1)
    {
        if (option >= 3)
            printf("该选项不存在\n");
        else if (option < 0)
            printf("该选项不存在\n");
        else if (!datas && option != 2)
            printf("文件中没有记录。\n");
        else
            fun_M[option]();
    }
    return 0;
}
void menu(void)
{
    printf("0) 读取文件\n");
    printf("1) 删除/修改记录\n");
    printf("2) 增加记录\n");
    printf("q) 退出\n");
}
void f_read(void)
{
    FILE * p_file;
    long int data_in = 0;
    int st_size = sizeof(BOOKS);
    BOOKS book;
    p_file = f_open();
    for (data_in = 0; data_in < datas; data_in += st_size)
    {
        fseek(p_file, data_in, SEEK_SET);
        fread(&book, sizeof(BOOKS), 1, p_file);
        printf("%-25s %s  ¥%.2f\n", book.title, book.author, book.value);
    }
    fseek(p_file, 0, SEEK_END);
    datas = ftell(p_file);
    fclose(p_file);
}
void data_add(void)
{
    BOOKS a;
    FILE * p_file;
    p_file = f_open();
    while (getchar() != '\n');
    while (printf("输入书名(空行结束):"), gets(a.title) != NULL && a.title[0] != '\0')
    {
        while (printf("输入作者:"), gets(a.author) == NULL || a.author[0] == '\0');
        printf("输入单价:");
        scanf("%f", &a.value);
        a.del_tag = 1;
        while (getchar() != '\n');
        fwrite(&a, sizeof(BOOKS), 1, p_file);
    }
    fseek(p_file, 0, SEEK_END);
    datas = ftell(p_file);
    fclose(p_file);
}
void data_delete(void)
{
    int arrays = datas / sizeof(BOOKS);
    BOOKS a[arrays];
    int n, array_in;
    FILE * p_file;
    p_file = f_open();
    for (n = 0, array_in = 0; n < datas && array_in < arrays; array_in++, n += sizeof(BOOKS))
    {
        fseek(p_file, n, SEEK_SET);
        fread(&a[array_in], sizeof(BOOKS), 1, p_file);
    }
    fclose(p_file);
    while (printf("0.删除\n1.修改\n2.返回主菜单\n"), scanf("%d", &n) == 1 && n != 2)
    {
        if (!n)
        {
            for (array_in = 0; array_in < arrays; array_in++)
                printf("%d %s %s: %.2f\n", array_in, a[array_in].title, a[array_in].author, a[array_in].value);
            while (printf("输入要删除的记录的编号,可选范围0-%d(q退出):", arrays - 1), scanf("%d", &array_in) == 1)
            {
                if (array_in > arrays)
                    printf("记录不存在.\n");
                else if (!a[array_in].del_tag)
                    printf("记录不存在.\n");
                else
                    a[array_in].del_tag = 0;
            }
            while (getchar() != '\n');
        }
        else if (n == 1)
        {
            for (array_in = 0; array_in < arrays; array_in++)
                printf("%d %s %s: %.2f\n", array_in, a[array_in].title, a[array_in].author, a[array_in].value);
            while (printf("输入要修改的记录的编号,可选范围0-%d(q退出):", arrays - 1), scanf("%d", &array_in) == 1)
            {
                if (array_in > arrays)
                    printf("记录不存在\n");
                else if (!a[array_in].del_tag)
                    printf("该记录已经被删除\n");
                else
                {
                    while (getchar() != '\n');
                    while (printf("输入新的书名:"), gets(a[array_in].title) == NULL || a[array_in].title[0] == '\0');
                    while (printf("输入新的作者名:"), gets(a[array_in].author) == NULL || a[array_in].author[0] == '\0');
                    printf("输入新的价格:");
                    scanf("%f", &a[array_in].value);
                }
            }
            while (getchar() != '\n');
        }
    }
    f_write(a, arrays);
}
FILE * f_open(void)
{
    FILE *p_file;
    if ((p_file = fopen("books_s.dat", "a+b")) == NULL)
    {
        fprintf(stderr, "无法打开文件");
        exit(EXIT_FAILURE);
    }
    fseek(p_file, 0, SEEK_END);
    datas = ftell(p_file);
    return p_file;
}
void f_write(BOOKS a[], int arrays)
{
    FILE * p_file;
    int array_in;
    if ((p_file = fopen("books_s.dat", "w+b")) == NULL)
    {
        fprintf(stderr, "无法打开文件");
        exit(EXIT_FAILURE);
    }
    for (array_in = 0; array_in < arrays; array_in++)
        if (a[array_in].del_tag)
            fwrite(&a[array_in], sizeof(BOOKS), 1, p_file);
    datas = ftell(p_file);
    fclose(p_file);
}
[此贴子已经被作者于2017-1-31 15:20编辑过]

											

	    