| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7045 人关注过本帖, 1 人收藏
标题:(5)C语言问题之人员管理系统
取消只看楼主 加入收藏
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-12-12 22:23:37的发言:

是的,丢失数据,大虫。

原来的:
if((fp=fopen(DATA_FILENAME,"w+"))!=NULL)

修改后:
if((fp=fopen(DATA_FILENAME,"a"))!=NULL)


这样改了以后,数据丢失的问题测试的时候表面上看是解决了,不知道是不是真的解决……
2015-12-12 22:38
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
程序代码:
/***************************文件导出***************************/
void Save(struct Personnel stu[],int Max)
{
    int i;
    FILE*fp;
    if((fp=fopen(DATA_FILENAME,"a"))!=NULL)
    {
        for(i=0;i<Max;i++)
            fprintf(fp,"%s\t%s\t%d\t%s\t%s\n",stu[i].name,
            stu[i].sex,
            stu[i].age,
            stu[i].IDcard,
            stu[i].profile);
        fclose(fp);
    }
    else
        printf("cannot open files!\n");
}

/***************************文件导入***************************/
int Read(struct Personnel stu[])
{
    printf("\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
    printf("\t┃                                                            ┃\n");
    printf("\t┃ **********★☆欢迎使用人员信息管理系统☆★********** ┃\n");
    printf("\t┃                                                            ┃\n");
    printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
    printf("\t┃                          文件导入                          ┃\n");
    printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
    int i;
    int result=-1;
    FILE *fp;
    if((fp=fopen(DATA_FILENAME,"r"))!=NULL)
    {
        for(i=0;!feof(fp);i++)
        {
            fscanf(fp,"%s\t%s\t%d\t%s\t%s\n",stu[i].name,
                stu[i].sex,
                &stu[i].age,
                stu[i].IDcard,
                stu[i].profile);
        }
        result=i;
        fclose(fp);
    }
    else
    {
        printf("\t\t\t打开文件失败!\n");
        printf("\t\t\t*************\n");
        printf("\t\t\t请按任意键返回主菜单……");
        getch();
    }
    return result;
}


[此贴子已经被作者于2020-3-23 13:37编辑过]

2015-12-12 22:38
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-12-12 22:39:52的发言:

没有,还有问题。

要是再有数据丢失的话,就是如果先在程序中输入数据,再导入文本中的数据的话,之前输入的数据会被覆盖掉。
2015-12-12 22:50
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
实在是没想到一个文件学问这么大……先弱弱地问下:“追加”是什么意思?看你们说了好多遍
“文件读写应是自动的,不让用户自己来!”感觉好高大上;
还有:“读入后,把文件删除了”,感觉同上句,是自动删除吗?

[此贴子已经被作者于2015-12-12 23:31编辑过]

2015-12-12 23:29
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-12-12 23:34:08的发言:

append,你以为fopen()的a是什么单词?

好吧,“保留原文件所有内容,向其文件尾部添加数据”——应该就是“追加”
2015-12-12 23:40
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-12-12 23:34:08的发言:

不要以为姓名包含空格很难想象,弄个英文名就有了,何况长度也不够。太多的人写程序用这个函数来接收姓名,一看就知道不实践的。对字符串不考虑空格,是非常严重的漏洞,可是又看见太多的人根本没有意识的。

感觉用gets()的话好像在导入文件的时候也会出问题,我试试看
2015-12-12 23:41
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
是不是需要用到书上的一种“按数据块读写文件”的方法?
2015-12-12 23:57
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
抱歉,昨天没打招呼就睡下了。二进制文件的相关内容只是稍微看了一下,给我最直观的一个大问题就是,通过修改二进制文件中的内容然后导入数据好像不容易实现。
2015-12-13 09:35
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用hellovfp在2015-12-13 00:18:24的发言:

或许你可以从这里找到另一种思路
https://bbs.bccn.net/thread-460169-1-1.html

按照这个思路,我修改了了下代码:
程序代码:
/***************************文件导出***************************/
void Save(struct Personnel stu[],int Max)
{
    int i;
    FILE*fp;
    if((fp=fopen(DATA_FILENAME,"a"))!=NULL)
    {
        for(i=0;i<Max;i++)
            fprintf(fp,"%s\t|%s\t|%d\t|%s\t|%s\n",stu[i].name,
            stu[i].sex,
            stu[i].age,
            stu[i].IDcard,
            stu[i].profile);
        fclose(fp);
    }
    else
        printf("cannot open files!\n");
}


[此贴子已经被作者于2020-3-23 13:11编辑过]

2015-12-13 09:38
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
额,说明一下,前四行的数据是我把\t删了后的效果,怎么看怎么觉得变扭,后来又加上了。
按照这个思路来的话,以"|"为分界线,名字之间加空格的问题应该可以解决了吧,可是sscanf语句又看不懂了
格式1:fred|30|18677442345   对应语句:"%[^|]|%ld|%s"
格式2:fred|30|18677442345|990|009    对应语句:"%[^|]|%d|%[^|]|%d|%s"
看了好久都不理解,只知道[^|]代表读取到不为|的字符串。

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

2015-12-13 09:44
快速回复:(5)C语言问题之人员管理系统
数据加载中...
 
   



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

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