| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4409 人关注过本帖
标题:【平安夜散分】武偉進
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:12 
【平安夜散分】武偉進
程序代码:
#include <cstdio>
#include <cstdlib>
#include "common.h"
#include "database.h"

/*
Field Student_Fields[] = {
    { "学号", 'I', 4, 0 },
    { "姓名", 'C', 30, 0 },
    { "性别", 'C', 1, 0 },
    { "年龄", 'I', 2, 0 },
    { "身份证", 'C', 18, 0 },
    { "联系电话", 'C', 20, 0 },
    { "地址", 'C', 50, 0 }
};
Header Student_Header = { _countof(Student_Fields), Student_Fields };
*/

Header Student_Header;

void List_Fields(const Header* header);

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        printf_s("命令格式: %s 数据文件名\n", Get_FileName(argv[0]));
        Pause();
        return EXIT_FAILURE;
    }

    FILE* file;
    if (fopen_s(&file, argv[1], "rt") == 0)
    {
        Load_Header(file, &Student_Header);
        fclose(file);
        List_Fields(&Student_Header);
    }
    //Create_Table(argv[1], &Student_Header);

    Pause();
    return EXIT_SUCCESS;
}

void List_Fields(const Header* header)
{
    size_t index;
    for (index = 0; index < header->Field_Number; ++index)
    {
        printf_s("%s  %c  %d,%d\n", 
            header->Fields[index].Name, 
            header->Fields[index].Type, 
            header->Fields[index].Length, 
            header->Fields[index].Decimal);
    }
}

图片附件: 游客没有浏览图片的权限,请 登录注册
2015-12-24 21:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
bool Load_Header(FILE* file, Header* header)
{
    char buffer[1024];
    bool success = true;

    rewind(file);
    bool inHeader = false;
    while (!ferror(file) && !feof(file) && fgets(buffer, _countof(buffer), file))
    {
        if (!inHeader)
        {
            _strupr_s(buffer, _countof(buffer));
            if (strcmp(buffer, "[HEADER]\n") == 0)
            {
                inHeader = true;
                continue;
            }
        }
        if (inHeader)
        {
            sscanf_s(buffer, "Fields Number: %u", &header->Field_Number);
            header->Fields = (Field*)calloc(header->Field_Number, sizeof(Field));
            if (header->Fields)
            {
                for (size_t index = 0; index < header->Field_Number; ++index)
                {
                    if (fgets(buffer, _countof(buffer), file))
                    {
                        Get_String(buffer, header->Fields[index].Name, sizeof(header->Fields[index].Name), '\"');
                        const char* p = strchr(buffer, '=');
                        if (p)
                        {
                            sscanf_s(p + 1, "%1c", &header->Fields[index].Type, 1);
                        }
                        else
                        {
                            header->Fields[index].Type = 'U';
                        }
                        p = strchr(buffer, '[');
                        if (!p || (sscanf_s(p, "[%d,%d]", &header->Fields[index].Length, &header->Fields[index].Decimal) != 2))
                        {
                            success = false;
                            break;
                        }
                    }
                    else
                    {
                        header->Field_Number = index;
                        success = false;
                        break;
                    }
                }
            }
            break;
        }
    }

    return success;
}


[此贴子已经被作者于2015-12-24 21:42编辑过]


授人以渔,不授人以鱼。
2015-12-24 21:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
#pragma once

// 字段結構
struct Field
{
    char Name[20];            // 名稱
    char Type;                // 類型
    int  Length;            // 長度
    int  Decimal;            // 小數位
};

// 表頭結構
struct Header
{
    size_t Field_Number;    // 字段數
    Field* Fields;            // 字段列表
};

// 用指定的結構建立數據表文件
errno_t Create_Table(const char* tableName, const Header* header);

// 從文件中讀取表頭
bool Load_Header(FILE* file, Header* header);

授人以渔,不授人以鱼。
2015-12-24 21:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
教他如何讀文件

授人以渔,不授人以鱼。
2015-12-24 22:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
寫出去是這樣:
程序代码:
void Write_Header(FILE* file, const Header* header)
{
    fprintf_s(file, "%s\n", "[Header]");
    fprintf_s(file, "Fields Number: %u\n", header->Field_Number);
    for (size_t index = 0; index < header->Field_Number; ++index)
    {
        fprintf_s(file, "\"%s\"", header->Fields[index].Name);
        fprintf_s(file, "=%c[%d,%d]\n", header->Fields[index].Type, header->Fields[index].Length, header->Fields[index].Decimal);
    }
}

授人以渔,不授人以鱼。
2015-12-24 22:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這是用文本格式的寫法,比較複雜,效率也低一點的。不過改用二進値格式的話,數據結構不用變化,在內部仍然是一樣的數據組織。

[此贴子已经被作者于2015-12-24 22:30编辑过]


授人以渔,不授人以鱼。
2015-12-24 22:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用hellovfp在2015-12-25 01:11:39的发言:

码了多少行代码了?如果用户写了写数据进去,要删除,添加些字段肿么办?还有用户一不小心修改到表头数据?


1.就現在看到那麽多行代碼
2.表頭寫爲明文祇是方便看而已,確實難以阻攔用戶更改結構,事實上就算像DBF文檔那樣寫成二進制格式,也無法阻擋,有心總能改得到
3.頂多做到儘量的容錯。

下面是修改了一些bug之後的結果,容許一些空行、一些空格。
程序代码:
bool Load_Header(FILE* file, Header* header)
{
    char buffer[1024];
    bool success = true;

    bool inHeader = false;
    while (success && !ferror(file) && !feof(file) && fgets(buffer, _countof(buffer), file))
    {
        if (*Str_Trim(buffer) == '\n')
        {
            continue;
        }
        if (!inHeader)
        {
            _strupr_s(buffer, _countof(buffer));
            if (strcmp(buffer, "[HEADER]\n") == 0)
            {
                inHeader = true;
                continue;
            }
        }
        if (inHeader)
        {
            sscanf_s(buffer, "Fields Number: %u", &header->Field_Number);
            header->Fields = (Field*)calloc(header->Field_Number, sizeof(Field));
            if (header->Fields)
            {
                size_t index = 0;
                while ((index < header->Field_Number) && fgets(buffer, _countof(buffer), file))
                {
                    if (*Str_Trim(buffer) != '\n')
                    {
                        Get_String(buffer, header->Fields[index].Name, sizeof(header->Fields[index].Name), '\"');
                        const char* p = strchr(buffer, '=');
                        if (p)
                        {
                            sscanf_s(p + 1, " %1c", &header->Fields[index].Type, 1);
                        }
                        else
                        {
                            header->Fields[index].Type = 'U';
                        }
                        p = strchr(buffer, '[');
                        if (!p || (sscanf_s(p, "[%d,%d]", &header->Fields[index].Length, &header->Fields[index].Decimal) != 2))
                        {
                            success = false;
                            break;
                        }
                        ++index;
                    }
                }
            }
            break;
        }
    }

    return success;
}


图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2015-12-25 09:27编辑过]


授人以渔,不授人以鱼。
2015-12-25 09:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
xml的读写器在.net中才有,自己写不现实。小型的数据管理,自己写就可以了,用不着数据库。

[此贴子已经被作者于2015-12-25 11:42编辑过]


授人以渔,不授人以鱼。
2015-12-25 11:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不用第三方解析库

授人以渔,不授人以鱼。
2015-12-25 12:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
很難看嗎?

授人以渔,不授人以鱼。
2015-12-25 13:42
快速回复:【平安夜散分】武偉進
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050713 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved