如何将文件指针指到文件的最后一行(文本文件)???

xguest 2001-02-05 10:06:00
多谢!!!!
...全文
771 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxi_gao 2001-02-08
  • 打赏
  • 举报
回复

FILE *file=fopen(...);
while(!feof())
{
char ch[1000];
fgets(ch,1000,ile);
CString m_endlinstr=(CString )ch;
}
m_endlinstr 你想要得数据,
用CFile类,不好,因为READ函数,要写大小;
而fgets是读小于或等与你的指定大小,不会多读,最多一行;
本人试过,好使。
或用
当文件很大时 (几十兆)CFile 倒叙查找“\n”也可以,
wt007 2001-02-07
  • 打赏
  • 举报
回复
对不起,忘了最重要的一句:
delete[] pBuffer;
在catch中也要加。
还有,CString类有个从后往前查找字符(字符串)的函数。
灌水太多,请多多包涵。
wt007 2001-02-07
  • 打赏
  • 举报
回复
CFile file;
if(!file.Open("filepath",CFile::modeRead))
return;
try{
UINT uFileLength=file.GetLength();
char *pBuffer=new char[uFileLength+1];
pBuffer[uFileLength]='\0';
file.Read(pBuffer,uFileLength);
CString str=pBuffer;
int nIndex=str.Find('\n',0);
while(nIndex++!=-1)
{
int n;
if((n=str.Find('\n',nIndex))==-1)
break;
nIndex=n;
}
if(nIndex==-1)
file.SeekToBegin();
else
file.Seek(nIndex,0);
}
catch(CFileException* fexp)
{
...
fexp.Delete();
}
wt007 2001-02-07
  • 打赏
  • 举报
回复
CFile file;
if(!file.Open("filepath",CFile::modeRead))
return;
try{
UINT uFileLength=file.GetLength();
char pBuffer=new char[uFileLength+1];
pBuffer[uFileLength]='\0';
file.Read(pBuffer,uFileLength);
CString str=pBuffer;
int nIndex=str.Find('\n',0);
while(nIndex!=-1)
{
int n;
if((n=str.Find('\n',nIndex+1))==-1)
break;
nIndex=n;
}
if(nIndex==-1)
file.SeekToBegin();
else
file.Seek(nIndex,0);
}
catch(CFileException* fexp)
{
...
fexp.Delete();
}
wt007 2001-02-07
  • 打赏
  • 举报
回复
CFile file;
if(!file.Open("filepath",CFile::modeRead))
return;
try{
UINT uFileLength=file.GetLength();
char pBuffer=new char[uFileLength+1];
pBuffer[uFileLength]='\0';
file.Read(pBuffer,uFileLength);
CString str=pBuffer;


wt007 2001-02-07
  • 打赏
  • 举报
回复
CFile file;
if(!file.Open("filepath",CFile::modeRead))
return;
try{
UINT uFileLength=file.GetLength();
char pBuffer=new char[uFileLength+1];
pBuffer[uFileLength]='\0';
file.Read(pBuffer,uFileLength);
CString str=pBuffer;


MadLee 2001-02-07
  • 打赏
  • 举报
回复
char buf[MAX_LINE_SIZE];
fstream f(FILENAME, ios::read | ios::binary | ios::nocreate);
long t1;
while(f.good()) {
t1 = f.tellg();
f.getline(buf, MAX_LINE_SIZE);
}
f.clear(ios::goodbit);
f.seekg(t1);
MAX_LINE_SIZE自己定义
MadLee 2001-02-07
  • 打赏
  • 举报
回复
fstream f(FILENAME, ios::read | ios::binary | ios::nocreate);
long t1 = 0, t2 = 0;
while(f.good()) {

f.getline(buf, MAX_LINE_SIZE);
}
xguest 2001-02-06
  • 打赏
  • 举报
回复
文本文件的定位已经定位,可是读出来的换行符怎么判断
char m_buf;
CFile f;
for (.............)
{
f.Seek(......)
f.Read(m_buf,1);
if (m_buf!="0x0a");
..............
...............
不行啊!
Fesd 2001-02-06
  • 打赏
  • 举报
回复
LPBYTE lpData;//TextFileData
int nLen = strlen((LPSTR)lpData);
for(LPBYTE lpCur = lpData+nLen;*lpCur != 0x0A;*lpCur--)
;
lpCur++;
wing_pn 2001-02-06
  • 打赏
  • 举报
回复
用二进制随机读取方式!!
不比文本方式复杂多少
回车换行是以0x0D和0x0A为标记,将指针移到文件尾部,再倒退到换行标志处。
xguest 2001-02-06
  • 打赏
  • 举报
回复
TO: YuHao
老兄,我不知如何向回查找,请明指!
YuHao 2001-02-06
  • 打赏
  • 举报
回复
如果ReadString返回FALSE,说明已经读到了文件末尾,改成if (!f.ReadString(str)) backstr=str就行了.
但是我不知道获得最后一行的位置以后,能不能定位到行的开头,似乎文本模式只能前进,而且只能单行读取.
我觉得如果文件比较大的话,用你的方法效率比较低,好的办法是先定位到文件末尾,在向回查找;如果文件不大的话,把文件读到一个StringList里面,处理以后再把StringList一次写到文件中,可能更方便.
xguest 2001-02-06
  • 打赏
  • 举报
回复
To :YuHao
请指教!
mrgong 2001-02-06
  • 打赏
  • 举报
回复
这种情况,最好使用一个数据库文件。
YuHao 2001-02-06
  • 打赏
  • 举报
回复
最好是检查ReadString的返回值,用str的长度判断可能不太可靠.你看一下ReadString的帮助就明白了.
xguest 2001-02-06
  • 打赏
  • 举报
回复
这样的做法可不可以?
CFile f;
CString backstr,str;
for (int i=0;i<1000;i++)
{
f.ReadString (str);
if (str.GetLength()!=0)
{
backstr=str;
}
else
{
str=backstr; //得到的最后一行
i=1000;
}
}
YuHao 2001-02-06
  • 打赏
  • 举报
回复
要用退回的话好像必须用二进制模式,文本模式只能单向的读.用CFile::SeekToEnd,或者API函数SetFilePointer到文件末尾,再用CFile::Seek或者SetFilePointer往前退,一直到找到会车换行为止.
如果文件不大的话,可以把文件的全部内容读到一个CStringList里面,处理起来比较方便.
xguest 2001-02-06
  • 打赏
  • 举报
回复
to:
genial_wolf怎么退回?
to:
CStdioFile类里也没有办法指到最后一行
bush 2001-02-06
  • 打赏
  • 举报
回复
GUAN ZHU
加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧