1. 程式人生 > >VC++讀取檔案的最後一行

VC++讀取檔案的最後一行

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