| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1292 人关注过本帖
标题:文件信息的删除
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
过几天写给你看吧

授人以渔,不授人以鱼。
2013-06-19 12:59
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 11楼 TonyDeng
好的,正好这几天我也忙着复习考试,等你忙完了再写也不急

思考赐予新生,时间在于定义
2013-06-19 13:23
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 9楼 TonyDeng
版主记得回复我啊,千万别忽悠我,我可等你的例子给我解释一下呢

思考赐予新生,时间在于定义
2013-06-20 02:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
会给你的,放心。

授人以渔,不授人以鱼。
2013-06-20 21:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
main.cpp
程序代码:
/*
    题目来源:<span style="color: #008000; text-decoration: underline;">https://bbs.bccn.net/thread-415375-1-1.html[/color]
    编程环境:Visual Studio 2012 C++
    2013.06.25
*/

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <conio.h>
#include "Employee.h"

void Pause(void);
bool Init(void);

const char* file_name = "data.txt";

void main(void)
{
    // 构建原始数据
    Init();

    printf_s("文件中的原始数据\n");
    std::vector<Employee*> employees = Employee::Load_Data(file_name);
    Employee::List(employees);

    Pause();

    // 删除一条记录并储存到文件中
    employees[1]->Delete();
    Employee::Save_Data(file_name, employees, 0, employees.size());

    printf_s("\n\n删除后的数据\n");
    Employee::List(Employee::Load_Data(file_name), false);

    Pause();
}

void Pause(void)
{
    printf_s("\nPress any key to continue...");
    _getch();
}

// 生成原始数据文件
bool Init(void)
{
    Employee* employees[] = {
        new Employee(110, 1, "张三", 25, 1900),
        new Employee(111, 2, "李四", 28, 1700),
        new Employee(112, 3, "王五", 30, 1900)
    };
    FILE* file;
    errno_t error_code = fopen_s(&file, file_name, "wb");
    if (error_code != 0)
    {
        printf_s("File %s open error: %d\n", file_name, error_code);
        return false;
    }
    for (size_t index = 0; index < _countof(employees); ++index)
    {
        Employee::Write_Record(*employees[index], file);
    }
    fclose(file);
    return true;
}


Employee.h
程序代码:
#ifndef _EMPLOYEE
#define _EMPLOYEE

class Employee
{
private:

    bool _deleted;      // 删除标志
    int _id;            // 工号
    int _type;          // 职工类型
    char _name[20];     // 姓名
    int _age;           // 年龄
    int _pay;           // 工资

public:

    Employee();
    Employee(int id, int type, const char* name, int age, int pay);

    void Display(void);
    const char* const ToString(void);
    void Delete(void);
    void Recall(void);
    bool IsDeleted(void);

    static Employee* Read_Record(FILE* file);
    static void Write_Record(Employee& record, FILE* file);
    static std::vector<Employee*> Load_Data(const char* file_name);
    static bool Save_Data(const char* file_name, std::vector<Employee*> employees, int start, size_t count);
    static void List(std::vector<Employee*>& employees, bool show_deleted = true);
};

#endif


Employee.cpp
程序代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include "Employee.h"

static const char* Employee_Type[] = {
    "教师",
    "临时教师",
    "主任"
};

Employee::Employee()
{
    _deleted = false;
    _id = 0;
    _type = 0;
    _name[0] = '\0';
    _age = 0;
    _pay = 0;
}

Employee::Employee(int id, int type, const char* name, int age, int pay)
{
    _deleted = false;
    _id = id;
    _type = type;
    strncpy_s(_name, name, sizeof(_name) - 1);
    _age = age;
    _pay = pay;
}

void Employee::Display(void)
{
    printf_s("工号: %03d\n", _id);
    printf_s("类型: %s\n", Employee_Type[_type - 1]);
    printf_s("姓名: %s\n", _name);
    printf_s("年龄: %d\n", _age);
    printf_s("工资: %d\n\n", _pay);
}

const char* const Employee::ToString(void)
{
    const size_t buffer_size = 100;
    char* buffer = new char[buffer_size];
    if (buffer != nullptr)
    {
        sprintf_s(buffer, buffer_size, "%c%03d %-10s %-20s %2d %6d", _deleted ? '*' : ' ', _id, Employee_Type[_type - 1], _name, _age, _pay);
    }
    return buffer;
}

void Employee::Delete(void)
{
    _deleted = true;
}

void Employee::Recall(void)
{
    _deleted = false;
}

bool Employee::IsDeleted(void)
{
    return _deleted;
}

Employee* Employee::Read_Record(FILE* file)
{
    Employee* e = new Employee;
    if ((e == nullptr) || fread(e, sizeof(Employee), 1, file) != 1)
    {
        e = nullptr;
    }
    return e;
}

void Employee::Write_Record(Employee& record, FILE* file)
{
    fwrite(&record, sizeof(Employee), 1, file);
}

std::vector<Employee*> Employee::Load_Data(const char* file_name)
{
    std::vector<Employee*> employees;
    FILE* file;
    errno_t error_code = fopen_s(&file, file_name, "rb");
    if (error_code == 0)
    {
        Employee* e;
        while (e = Employee::Read_Record(file))
        {
            employees.push_back(e);
        }
        fclose(file);
    }
    else
    {
        printf_s("File %s open error: %d\n", file_name, error_code);
    }
    return employees;
}

bool Employee::Save_Data(const char* file_name, std::vector<Employee*> employees, int start, size_t count)
{
    bool result(true);
    FILE* file;
    errno_t error_code = fopen_s(&file, file_name, "wb");
    if (error_code != 0)
    {
        printf_s("File %s create error: %d\n", file_name, error_code);
        result = false;
    }
    for (size_t index = start; index < start + count; ++index)
    {
        Employee::Write_Record(*employees[index], file);
    }
    fclose(file);
    return result;
}

void Employee::List(std::vector<Employee*>& employees, bool show_deleted)
{
    for (std::vector<Employee*>::const_iterator iterator = employees.cbegin(); iterator != employees.cend(); ++iterator)
    {
        if (!(*iterator)->IsDeleted() || show_deleted)
        {
            const char* const buffer = (*iterator)->ToString();
            printf_s("%s\n", buffer);
            delete buffer;
        }
    }
}

授人以渔,不授人以鱼。
2013-06-25 04:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
补充:
1.其实Load_Data()、Save_Data()和List()方法,可以不放在Employee类中,因为它与对象的具体组织形式有关;
2.在Windows系统中的程序,可以不释放动态分配的内存,系统会保证在程序结束后收回,所以在这里并没有对所有动态分配的内存都写释放代码。

授人以渔,不授人以鱼。
2013-06-25 10:44
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 16楼 TonyDeng
真的非常感谢,我先拿去参考一下了!很有价值

思考赐予新生,时间在于定义
2013-06-25 12:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把那三个方法搬回main.cpp中吧,我原先就是在那里的,后来手痒改成这样(看看代码就知道了,出现类引用表明原先是在外部的),发帖后就后悔了。

我之所以改了你原先用文本格式储存数据,是因为用scanf()系列读字符串时会被空格干扰,又懒得写定长格式的读写代码,就用了二进制储存格式,你可以自己改回去的,反正原理就那么回事。写得匆忙,有很多东西还可以改进的,自己琢磨吧,现在分解的函数已考虑到将来各种变化需求了。

[ 本帖最后由 TonyDeng 于 2013-6-25 13:06 编辑 ]

授人以渔,不授人以鱼。
2013-06-25 13:05
快速回复:文件信息的删除
数据加载中...
 
   



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

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