现在的位置: 首页 > 综合 > 正文

VC++读取文件的最后一行

2017年02月08日 ⁄ 综合 ⁄ 共 1688字 ⁄ 字号 评论关闭

FILE* fp = fopen("Datalog.dat", "a+");

char Vall[201];

while(NULL != fgets(Vall, 200, fp))                                         //用fgets是因为fscanf(,%s,); 遇到空格会停止。每一行都有换行符,读到文件尾则不再循环/

{
fgets(Vall, 200, fp);//虽然每次最多读取200个,其实只读取到"\n"就停止了,正合我心意

}

char delims[] = "#";

vPath = strtok(Vall, delims );//拆分字符串。“#”为分隔符/
vTaskName = strtok( NULL, delims );

但是问题出现了。另外一个窗口打开后,fgets()和openfile.ReadString()都执行不成功,读取到第一条数据后,就退出了循环。

也就是说,无法做到自动读取一行;然后尝试令一些函数:

 

	HANDLE pfile;	
	pfile=::CreateFile("D:\\vc\\DataList.dat",
		GENERIC_READ,		//指定读控制,可以从对象中读取数据(指针将可以移动)。 /
		0,					//指定对象的共享模式。如果dwShareMode==0,表示是互斥使用的。/
		NULL,				//参数为NULL,句柄就不能被子进程继承。/
		OPEN_EXISTING,		//打开文件(如果不存在就返回失败)/
		FILE_ATTRIBUTE_NORMAL,		//文件没有其他属性设置,此属性只能单独使用才合法。/
		NULL);//用这个函数比OpenFile好			|FILE_FLAG_DELETE_ON_CLOSE
	if(pfile==INVALID_HANDLE_VALUE) 
	{ 
		AfxMessageBox("打开文件失败"); 
		CloseHandle(pfile);//一定注意在函数退出之前对句柄进行释放。 
		return; 
	} 
	DWORD filesize=GetFileSize(pfile,NULL); 
		fflush(stdin);
	char* buffer=new char[filesize+1];//最后一位为'/0',C-Style字符串的结束符。 
	DWORD readsize; 
	ReadFile(pfile,buffer,filesize,&readsize,NULL); 
	buffer[filesize]=0; 
AfxMessageBox(buffer);

函数执行成功了,也不与窗口冲突,只是获得了一大串字符后,分割每一行、每一块,又成了新问题。

MFC字符串类有Find正向查找,ReversFind反向查找,Left左截取,Right右截取,Mid任意位置截取函数,配合使用就可以实现

CString Left( int nCount ) const;                  
//从左边1开始获取前 
nCount 个字符

CString Mid( int nFirst ) const;                     
//从左边第 
nCount+1 个字符开始,获取后面所有的字符

CString Mid( int nFirst, int nCount ) const;    //从左边第 nFirst+1 个字符开始,获取后面 nCount 个字符

CString Right( int nCount ) const;                 
//从右边1开始获取从右向左前 
nCount 个字符

例1:CString str = _T("taohongmin");
int pos = str.ReverseFind('m'); //此时pos = 7;
例2:CString s( "abcabc" );
 s.ReverseFind( 'b' ) == 4  // true;
 

例:

 CString a,b;  a = "123456789";

 b = a.Left(4);   //值为:1234  b = a.Mid(3);    //值为:456789  b = a.Mid(2, 4); //值为:3456  b = a.Right(4);  //值为:6789

 

抱歉!评论已关闭.