两个简单问题100分,快来接分
问题1:
读取*.txt文件,发现用我以下代码
CString context;
CStdioFile f1(pFileName,CFile::modeRead);
CString strLine;
while(f1.ReadString(strLine)) //一行行地读
context=context+strLine;
的话只能读取文件不是很大的文本,我读取8M大的文本就一直停着不动了,
有没有办法一次性把8M大的文本全部存到一个字符串里?
为什么8M的文本就读不动了呢?
问题2:
char *s = splitFun(pctx,0,"C:\\CSW\\"); //路径为本组件的存放路径
我修改成相对路径char *s = splitFun(pctx,0,"\\CSW\\");就找不到组件了,
改成".\\CSW\\","..\\CSW\\" 都没用,相对路径应该怎么改呢?
问题点数:100、回复次数:23Top
1 楼boyplayee()回复于 2006-03-14 22:20:33 得分 0
在来一个问题:
对话框中有一个button和一个edit控件 ,相关代码:
OnButton(){
CFileDialog dlg(.............)
if(dlg.DoModal()==IDOK)
{
UpdateData(true);
m_edit=dlg.GetPathName();
SetWindowText(m_edit);////这行正确显示了,确定m_edit里有值
}
为什么我选择了文件之后,Edit控件里不出现文件路径呢?Top
2 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-03-14 22:22:07 得分 10
1.应该一次读入一整块,然后在内存中进行分析或者使用FileMapping
2.你的程序运行时的工作目录在哪?Top
3 楼boyplayee()回复于 2006-03-14 22:53:03 得分 0
1"一次读入一整块","FileMapping" 怎么做呢?
2运行时的工作目录是我整个工作文件夹所在的目录,即是*.exe运行的目录Top
4 楼Steven7(Steven7)回复于 2006-03-14 22:55:50 得分 12
第一个问题,需要用buffer
第二个问题,没有看到代码,估计和splitFun的实现有关
最后一个问题简单,需要 UpdateData(FALSE)Top
5 楼vcmute(BCare4 H1Rest Good9!)回复于 2006-03-14 22:58:03 得分 12
DWORD len=f.GetLength();
BYTE buf=new BYTE[len];
f.ReadHuge(buf,len);Top
6 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-03-14 23:13:20 得分 6
\\CSW\\写法不对Top
7 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-03-14 23:14:49 得分 4
要看你的运行目录在哪儿Top
8 楼boyplayee()回复于 2006-03-14 23:19:19 得分 0
本组件的存放路径 就在MFC.exe的同一个目录的下的CSW文件夹下Top
9 楼cyblueboy83(爱情白痴—电脑迷)回复于 2006-03-15 00:17:58 得分 13
第一个问题,需要用buffer
DWORD len=f.GetLength();
BYTE buf=new BYTE[len];
f.ReadHuge(buf,len);
第二个问题,没有看到代码,估计和splitFun的实现有关
最后一个问题简单,需要 UpdateData(FALSE)
Top
10 楼TianChong(*︿_︿* ○Ооo○泡泡oо㊣VC高手群:2997669)回复于 2006-03-15 00:19:40 得分 0
除了使用横秋的方法:
DWORD len=f.GetLength();
BYTE buf=new BYTE[len];
f.ReadHuge(buf,len);
之外,你还可以使用一个变量,每读一行就加1,如果等于100行,则将读取的context写入到一个edit控件里,或者字符串数组中去,然后context清空,继续读取...读取完毕后,控件里的内容或数组中的内容就是你要的内容了.不过这个方法没有上面的好.Top
11 楼TianChong(*︿_︿* ○Ооo○泡泡oо㊣VC高手群:2997669)回复于 2006-03-15 00:26:55 得分 2
第三个问题,你修改控件内容后,需要 UpdateData(FALSE)让控制接受并重画才能显示.
第二个问题,如果的确不能使用相对路径,你可以先取得当前路径GetCurrentDirectory.并保存在一个变量里,然后与你的子目录相连接,组合成绝对路径,这种方法一定行的,我处理过这类问题,最后也是懒得再研究,直接取绝对路径了事.
祝成功Top
12 楼echomo123(无语)回复于 2006-03-15 01:08:31 得分 4
1.有读取大文件的函数,不过一般不用
CFile.ReadHuge(p,length);Top
13 楼ccs02287(☆兜兜里有糖☆偶滴兜兜里有糖,你和我玩不?)回复于 2006-03-15 09:48:46 得分 2
换别的函数吧Top
14 楼boyplayee()回复于 2006-03-15 14:20:13 得分 0
第三个问题 出现如下奇怪问题:
OnButton(){
CFileDialog dlg(.............)
if(dlg.DoModal()==IDOK)
{
UpdateData(false);
m_edit=dlg.GetPathName();
SetWindowText(m_edit);////这行正确显示了,确定m_edit里有值
}
当我更换另一个盘符或者目录后,第一个 Edit控件里显示总是不变,从新第二次选择文件后才更新,这是怎么回事呢?Top
15 楼TianChong(*︿_︿* ○Ооo○泡泡oо㊣VC高手群:2997669)回复于 2006-03-15 14:35:56 得分 0
老兄是在下面的操作后UpdateData(false);
////////////////////////////////////////////////
m_edit=dlg.GetPathName();
SetWindowText(m_edit);////这行正确显示了,确定m_edit里有值
UpdateData(false); //这里!!!!!!!!!!!!!!!!!!!!!
}
Top
16 楼boyplayee()回复于 2006-03-15 19:29:47 得分 0
第二个问题还没解决,如何获得这个MFC程序的路径(运行的时候获得).Top
17 楼boyplayee()回复于 2006-03-15 19:42:45 得分 0
读取8M大的文本就一直停着不动了,这个问题我猜是不是一个CString的存储是有限制的.
另:
BYTE buf=new BYTE[len];
f.ReadHuge(buf,len);
通不过编译啊Top
18 楼shmily1280(锄禾)回复于 2006-03-15 20:40:29 得分 3
楼上的问题要自己调试,大家给的是思路和方法
Top
19 楼ruodeer(看我的个性签名都给我分)回复于 2006-03-15 21:01:03 得分 1
又学了一招
顶Top
20 楼xiachangyu()回复于 2006-03-15 23:35:27 得分 1
顶Top
21 楼TianChong(*︿_︿* ○Ооo○泡泡oо㊣VC高手群:2997669)回复于 2006-03-17 10:52:36 得分 25
获取自身程序的路径
使用GetModuleFileName()可以得到全路径,再用AfxGetApp()->m_pszExeName可获得程序名
下面是个例子:
TCHAR exeFullPath[MAX_PATH]; //定义全路径变量MAX_PATH一般为256大小
CString strPath; //用于后面对TCHAR []的转换
GetModuleFileName(NULL,exeFullPath,MAX_PATH); //取得全路径名,NULL表示自身程序
strPath=(CString)exeFullPath; //强制转换
int position=strPath.ReverseFind('\\'); //找到最后一个\\的位置,因为这是包括程序名(即*.EXE)在内的全路径名,要去掉后面的*.EXE得到的才是路径,而不包括程序文件名.
strPath=strPath.Left(position+1); //这里截取
如果你取得的路径后面没有\\,一般来说,取得路径后你还要在后边加上“\\”才行。
还有,除了这种方法可以在程序任意地方,任何时候使用之外,还有二种方法你也可以使用,但是要在程序开始时使用,因为你改变目录后,它也会跟着改变,并且这种不是推荐的用法,只是给你多一个选择和多一个思路:
方法2.在一启动的时候用 GetCurrentDirectory获得启动时的目录,这个目录在许多情况下就是程序所在目录,但用户可以通过修改快捷方式中的设置启动目录。
方法3.
调用__argv[0],如strcpy(filename, __argv[0]);
__argv[0]包括本程序的路径和EXE文件名,你可以从中得到程序路径。方法如第一种方法,这种方法不受快捷方式中的设置影响。
Top
22 楼TianChong(*︿_︿* ○Ооo○泡泡oо㊣VC高手群:2997669)回复于 2006-03-17 10:53:31 得分 0
楼主,还没答过一次这么多问题的,该给分了吧?呵呵.Top
23 楼hsyouxishe(金笛玉洁)回复于 2006-03-17 13:09:14 得分 5
参考一下我的这个帖子吧
http://community.csdn.net/Expert/topic/4619/4619094.xml?temp=8.274478E-02Top




