师傅为了培训我,给我分配了一个任务,说要统计记事本中不同后缀名文件的个数,而且记事本中可能出现的后缀名是未知的,请问各位大虾能否指点一二,小弟将不胜感激!
记事本数据如下所示:
2001-01-01 01:00 <DIR> .
2001-01-01 01:00 <DIR> ..
2001-01-01 02:50 44,687 vmware-0.log
2010-12-27 07:59 71,987 vmware-1.log
2010-12-20 13:36 84,712 vmware-2.log
2001-01-01 02:53 55,726 vmware.log
2001-01-01 02:53 96,141,312 Windows XP Professional-000001.vmdk
2010-12-20 13:20 377,487,360 Windows XP Professional-Snapshot1.vmem
2010-12-20 13:20 136,185,393 Windows XP Professional-Snapshot1.vmsn
2001-01-01 02:53 8,684 Windows XP Professional.nvram
2010-12-20 13:20 10,297,999,360 Windows XP Professional.vmdk
2010-12-20 13:10 377,487,360 Windows XP Professional.vmem
2010-12-20 13:20 464 Windows XP Professional.vmsd
2001-01-01 02:50 2,438 Windows XP Professional.vmx
2010-12-17 13:01 278 Windows XP Professional.vmxf
C++呢,自学过一丁点儿基础,这样操作文件不会。。。。
我是搞.net的,说说.net里面的东西吧。
.net里面string(字符串类型)有一个lastindexof(char c)就是最后一个你指定的字符的索引,
还有一个substring(int startindex,int length)从startindex处截取length长度的字符串,
还有一个split(char c),把一个字符串分割,比如说aaa,bbb,c传入参数是,那么得到一个字符串数组
aaa bbb c
这样子,然后我记得java(还是.net)有hashtabel这个概念,存储的是一个键值对,不能重复,
我想C++中也应该有类似的概念,有了这么多东西,你这个程序应该有思路了吧?
我认为应该用strchr函数在每行中查“.”,记下.后的字符(后缀),然后统计
其实挺简单的,因为文件后缀是未知的,你需要统计个数,如果你熟悉STL的话,可以用里面的map。(C#里相当于可以用Dictionary),也就是键-值对的数据结构。
获取文件后缀,可以用 fgets 逐个获取文本行。用 strrchr 查找到最后一个小数点,之后就是文件后缀。当然你也可以使用CString和STL里的string。
这个真心简单,你该动动脑子的。
const string dir = @"C:\Documents and Settings\";
System.Collections.Generic.Dictionary<string, int> countdir = new Dictionary<string, int>();
foreach (var t in System.IO.Directory.GetFiles(dir, "*", System.IO.SearchOption.TopDirectoryOnly))
{
var ext=System.IO.Path.GetExtension(t);
if (!countdir.ContainsKey(ext))
{
countdir.Add(ext, 0);
}
countdir[ext]++;
}
foreach (var s in countdir)
{
System.Console.WriteLine("{0} - {1}", s.Key, s.Value);
}