操作系统实验报告五
姓名:许恺
学号:2014011329
日期:12.13
一.思路构想
关于这次的实验我真的是摸不着头脑,不知道到底让做出一个什么样的东西来,感觉要求说的又清楚又模糊,听过同学的解释,应该是要做一个像Windows那样的文件系统,去管理我们有的10万多个网页,那既然是文件管理系统,我就想到了以前做过的一个学生管理系统,应该差不多吧,虽然只需要实现查询功能,应该用终端实现就可以,所以我想的是用终端来实现流程的可视化,通过在内存中开辟巨大空间来实现文件的管理。构造一个数据结构来存放文件的属性。
二.源代码及结果贴图
// webserver5.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "fstream" #include "windows.h" #include "string" #include "time.h" using namespace std; struct FileStruct { string Nam; //文件名称 FILETIME t; //文件创建时间,因使用需要,所以是FILETIME类型的 string info;//文件内容 }; struct FileStruct f[1000]; void Init1(); void ByName(); void ByTime(); string WORD2string(WORD w); int main() { int j; Init1(); while (true) { cout << "请选择检索文件方式:" << endl;//界面友好 cout << " 1.文件名检索" << endl; cout << " 2.创建时间检索" << endl; cout << " 0.退出系统" << endl; cin >> j; if (j == 0) break;//0则退出 else if (j == 1)//1则通过名字查询 { ByName(); } else if (j == 2)//2则通过时间查询 { ByTime(); } else { cout << "请选择0,1,2中的一个!" << endl; } } return 0; } /* ***数据结构初始化 */ void Init1()//我不明白为什么到这就堆栈溢出了,汇编代码也没看懂 { int i; ifstream fp[1000]; //用10000个文件读的对象 string which = ""; string file[1000]; LPCSTR s1; //参数类型转换 WIN32_FIND_DATAA filestruct;//搜索文件属性 handle_t hf; //句柄指针 for (i = 0; i < 1000; i++) //初始化,将1000个页面的信息读到数据结构中 { which = to_string(i); file[i] = "D:\\xukai\\学习\\操作系统实验\\网页\\" + which + ".html "; fp[i].open(file[i], std::ios::binary); //打开文件失败 if (!fp[i].is_open()) { cout << "请求文件" << which + ".html" << "不存在" << endl; } else//打开文件成功并读取 { f[i].Nam = which + ".html"; s1= file[i].c_str(); //转换参数类型 //cout << s1<< endl; hf = FindFirstFileA(s1, &filestruct);//用一个特别的函数,在这里我解决了函数参数类型问题,简直太牛逼了!!! f[i].t = filestruct.ftLastWriteTime;//文件上次修改时间 char buffer[1024]; while (fp[i].good() && !fp[i].eof()) { fp[i].getline(buffer, 1024); //将读取的内容追加入info中 f[i].info.append(buffer); buffer[0] = '\0'; } fp[i].close(); } } FindClose(hf); } /* **通过文件名搜索文件 */ void ByName() { string name; int i; cout << "请输入要搜索的文件名:"; cin >> name; for (i = 0; i < 1000; i++) { if (strcmp(name.c_str(), f[i].Nam.c_str()) == 0)//比较文件名 { cout << f[i].info << endl;//输出文件内容 break; } } if (i == 1000) cout << "查无此文件!或者输入有误" << endl;///报错 } /* *****通过时间搜索文件 */ void ByTime() { string str, str1;//用户输入的时间字符串 int i; //bool judge; //判断FileTimeToSystemTime函数是否成功 SYSTEMTIME st;//用于类型转换的 cout << "请输入要搜索文件的创建时间(格式为:YYYY-M-D):"; cin >> str1; for (i = 0; i < 1000; i++) { FileTimeToSystemTime(&(f[i].t), &st);//将FILETIME转换成SYSTEMTIME的 //cout << judge << endl; st.wHour = (st.wHour+8) % 24;//解决类型转换后慢8小时问题 str = WORD2string(st.wYear) + "-" + WORD2string(st.wMonth) + "-" + WORD2string(st.wDay); /*调整格式转化成string格式的*/ //cout << str << endl; if (strcmp(str1.c_str(), str.c_str()) == 0)//比较找到文件 { cout << f[i].info << endl; break; } } if (i == 1000) cout << "查无此创建时间!或者输入有误" << endl;//报错 } /* ****WORD转成string函数,自己写的 */ string WORD2string(WORD w) { char tmpbuff[16]; sprintf_s(tmpbuff, "%d", w); string res = tmpbuff; return res; }
我知道是因为我的静态变量太大了,所以导致了栈溢出,这个可以解决,但是下面的问题就解决不出来了:
程序会在这里死循环,我不太能看懂这里的原因,所以报告就在这里抛锚了。。GG
但是!!!!!!!!!!!!!!!
我的代码又起死回生了23333!!
我知道问题的原因,于是我把数据改成了1000个,因为10000实在太大了,也怪我没有用动态内存,于是我的代码可以跑了,但是这还不算什么,后面我又碰到了函数参数类型错误的问题,但是!!!都被我一一解决了,成就感爆棚!!无法描述我的喜悦和激动,恩就这样。下面是我的结果贴图:
三.分析与感悟
分析和感悟什么的其实是有的,这次的报告实际上并不难,但是开始可能不太好理解他的意思,等我理解后就好写了,占用的内存确实很大,也没有用动态内存,很难的地方就是读文件的各种属性,不过也学到好多,第二个难点就是将那个文件的属性再变成字符串,这大概就是最大的难点了吧,后来我避开了因为栈溢出而导致的死循环问题,又查阅了大量资料解决了后面的bug,经历千辛万苦终于修成正果,这次的实验真的是查了相当多的材料,学了好多东西,后面我会好好搞一下动态内存的东西,以后面对比较大的变量的时候可以游刃有余。编程真是件有趣的事情~
三.参考材料
1.http://bbs.csdn.net/topics/390348063 提取文件属性
2.http://blog.sina.com.cn/s/blog_4d1e14550100aui4.html
4.http://blog.sina.com.cn/s/blog_793c41ec0100ve8w.html
6.http://blog.csdn.net/huapeng_guo/article/details/7614978都是为了提取文件的属性
7.http://bbs.csdn.net/topics/390747683
8.http://blog.csdn.net/tracyzhongcf/article/details/3711684
10.http://blog.csdn.net/renyhui/article/details/51165066解决头文件问题
11.http://vopit.blog.51cto.com/2400931/559787
12.https://zhidao.baidu.com/question/210718525.html
13.http://blog.csdn.net/brook0344/article/details/8126017
14.http://blog.csdn.net/ldd530314297/article/details/42551793
15.http://bbs.csdn.net/topics/390438875
16.http://wuliang20080412.blog.163.com/blog/static/905220552010320018881/ 以上是为了解栈溢出问题
17.http://weihe6666.iteye.com/blog/1440723
18.https://zhidao.baidu.com/question/521221386.html?qbl=relate_question_3&word=WORD%20%D7%AA%CE%AAstringWORD类型转string类型
19.http://bbs.csdn.net/topics/145726
20.http://baike.baidu.com/link?url=EYTiA-BaIjaJ60Mn_BXp6iNTF9K-DyZIWnvWMYSOkscQXCkw8AZqX1gv0fM0DDdWJgvb05_DEHL12xf9OtuWp505B2ng_vzM71jZUihgRLC filetimetosystem函数的应用
21.http://blog.sina.com.cn/s/blog_66ec4d660101bv9t.html FileTimeToSystemTime的注意事项
22.http://bbs.csdn.net/topics/50035890 filetimetosystem函数
23.https://zhidao.baidu.com/question/324197690.html findfirstfile函数详解
24.查看函数定义