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


你回看我之前主题帖回复是怎么说的

“文件读写应是自动的,不让用户自己来!”,这句?不知道是不是……
2015-12-13 11:31
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-12-13 10:37:11的发言:

学那些奇怪又没绝对作用的东西干嘛。用文本数据最关键的一点诀窍是定长,不用分隔符也可以。用分隔符要看数据内容是否也用了你的分隔符。另一种有效的办法是用xml协议。

怎么定长?让我做的话只能%1s,%2s,%3s……一个一个碰了

学校要求开会,晚点回复

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

2015-12-13 11:32
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
以下是引用TonyDeng在2015-12-13 10:37:11的发言:

学那些奇怪又没绝对作用的东西干嘛。用文本数据最关键的一点诀窍是定长,不用分隔符也可以。用分隔符要看数据内容是否也用了你的分隔符。另一种有效的办法是用xml协议。


俺汗,只是让他打开一种解决的思路,文本数据格式很多种,xml还不是一种分隔符和元素值表达的混合方式,他也可以定义自己的数据表达格式。像这样:
[student]
name=wu wei;
sex=man;
phone=1233339;
.......

我们都在路上。。。。。
2015-12-13 12:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 51楼 武伟
以下是引用TonyDeng在2015-11-15 23:06:02的发言:

那是你編寫程序時沒考慮到數據文件怎麽從無到有,如何增,如何刪,如何改。很多人寫的所謂課設,最終不過一千行左右,但實際上這個行數是遠遠不夠的,必然漏洞百出,就是根本沒考慮我所説的那些情況。是否讓人繞過程序直接修改數據文件,是必須在設計階段就決定好的,是與否,對整個程序的設計實現影響非常大,具體來說就是使用文本文件格式和二進制格式的區別。文本格式,可以讓用戶繞過程序對數據文件動手脚,但那就存在他破壞數據格式的風險,對程序的容錯能力要求很高;二進制格式,則必須由程序全部負責對數據文件的一切管理操作,不容用戶對數據文件動手脚,此時程序提供的功能必須足夠,比如數據增加,有多種形式,末尾追加、中間插入、空文檔時如何處理、數據量大時如何處理,等等,都要考慮到,即對程序的設計要求較高。一個程序滿足使用需要,最基本的要求是在各種各樣的情景下都不能出錯而且結果必須正確。不是某些人以爲的那麽簡單,一千行代碼搞得定,那衹能是無用的兒戲課。


授人以渔,不授人以鱼。
2015-12-13 18:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 53楼 hellovfp
我前面说的是,对数据库管理来说,文本文件可以不用分隔符,如果非要用分隔符,可以考虑的另一种分隔方案即xml那样的。

授人以渔,不授人以鱼。
2015-12-13 18:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 52楼 武伟
无论是文本文件还是二进制文件,最重要的都是定长数据,所有数据类型都应定长。由于C的内置数组特性,它是定长的,无法在运行时变长,所以不可能适应外部数据长度变化的情形,这就决定了外部数据是不能变化长度的。文本文件可以被用户在程序外直观地编辑,就必然存在改变数据长度及数据合法性的可能,这是这种存储格式最大的缺陷,也是它最大的优点——只有人才能识别这种格式的数据,但也只有人这么灵活的动物才可以击破死板的机器程序破坏数据——事物的对立统一性,最强处必然同时是其最弱处。

用C语言读写文本数据,尤其是字符串,最佳的函数是fgets(),它是指定读入字符数目的,不管数据内容包含什么杂七杂八的字符,都照收不误,用不着低效的正则表达式,何况无论使用什么%s格式符,都无法用scanf()系列函数读到包含space字符的串。实践检验的处理方法有两种:一是先读入整行,然后做字符分析提取数据;二是逐字节读取。两种都要有数据合法性检查和转换工作,那是省不了的。文本数据的系统,最大代码量在于从字符串中分析和转换数据。

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


授人以渔,不授人以鱼。
2015-12-13 19:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
题外话

C++11下的C++标准库,包含正则表达式程序库。《C++ Primer》第五版P.649有如下内容:
建议:避免创建不必要的正则表达式
如我们所见,一个正则表达式所表示的“程序”是在运行时而非编译时编译的。正则表达式的编译是一个非常慢的操作,特别是在你使用了扩展的正则表达式语法或是复杂的正则表达式时。因此,构造一个regex对象以及向一个已存在的regex赋予一个新的正则表达式可能是非常耗时的。为了最小化这种开销,你应该努力避免创建很多不必要的regex。特别是,如果你在一个循环中使用正则表达式,应该在循环外创建它,而不是在每步迭代时都编译它。


scanf()和printf()函数族中运用格式控制串,原理上与此相同。这就是我经常说这类函数那些复杂的格式表达式不算是C语言知识的原因,它已经超越C语言静态编译和检查的本质,属于动态解释执行语言的范畴,相当于一个内嵌微型的BASIC解释器,那些是"BASIC"语法,不是C语法。

我的基本观点:对scanf()的格式串,学会和使用最基本最简单的%c、%d、%s以及若干长度、类型控制之类格式即可,不要把精力放在钻研“高级技术”之上,那只会引诱你偏离本语言。到你真正的成为高级编程人员时,可以考虑钻研这些,那时才不会失去方向,也更知道应该怎么用,而不是被诱惑。

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


授人以渔,不授人以鱼。
2015-12-13 19:42
武伟
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:506
专家分:2638
注 册:2015-7-23
收藏
得分:0 
以下是引用TonyDeng在2015-12-13 19:13:56的发言:

用C语言读写文本数据,尤其是字符串,最佳的函数是fgets(),它是指定读入字符数目的,不管数据内容包含什么杂七杂八的字符,都照收不误,用不着低效的正则表达式,何况无论使用什么%s格式符,都无法用scanf()系列函数读到包含space字符的串。实践检验的处理方法有两种:一是先读入整行,然后做字符分析提取数据;二是逐字节读取。两种都要有数据合法性检查和转换工作,那是省不了的。文本数据的系统,最大代码量在于从字符串中分析和转换数据。

课设的要求是以文本文件保存,看懂了,没思路,不知道咋写。,T版能给写一个吗?
2015-12-13 21:05
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
以下是引用TonyDeng在2015-12-13 19:42:44的发言:

题外话

C++11下的C++标准库,包含正则表达式程序库。《C++ Primer》第五版P.649有如下内容:


scanf()和printf()函数族中运用格式控制串,原理上与此相同。这就是我经常说这类函数那些复杂的格式表达式不算是C语言知识的原因,它已经超越C语言静态编译和检查的本质,属于动态解释执行语言的范畴,相当于一个内嵌微型的BASIC解释器,那些是"BASIC"语法,不是C语法。

我的基本观点:对scanf()的格式串,学会和使用最基本最简单的%c、%d、%s以及若干长度、类型控制之类格式即可,不要把精力放在钻研“高级技术”之上,那只会引诱你偏离本语言。到你真正的成为高级编程人员时,可以考虑钻研这些,那时才不会失去方向,也更知道应该怎么用,而不是被诱惑。



哈哈,又码了这么多字,趁楼主不在,俺也码点,吹吹水。不过拿c++新标准类库来说printf,scanf,压根就不是一回事,事实是c里的这些东西并不是真真的正则表达式,不过是简单的一些格式控制罢了,判断一个字符是处理还是丢弃,读读源代码就知道,和你自己读出来,再逐字解析一样。c primer中那段最后一句早在Effetive C++一书中讨论过了,不过既然正则表达式类在C++11里作为STL标准库的一部分存在,就说明了有程序员的需求,而且不是少数,那点性能上的问题,对于大家目前普遍4核的机器来说,不会是什么大事吧?

好吧,老T最后的观点俺也认同,无意中引诱了楼主,还是不要脱离学语言的初衷,让他去弄个xml解析啥的也基本不现实,弄简单些吧。

我们都在路上。。。。。
2015-12-13 21:35
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
还有些问题,估计楼主木有考虑,比如如果你的结构数组有100个空间,记录有200个这么办?

貌似楼主头大了,T版赶紧码段代码吧,嘿嘿

我们都在路上。。。。。
2015-12-13 21:42
快速回复:(5)C语言问题之人员管理系统
数据加载中...
 
   



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

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