vc讀取文本文件

CString   csLine;  
  try  
  {  
        CStdioFile   file("c://autoexec.bat",CFile::modeRead);  
        while(file.ReadString(csLine))  
              AfxMessageBox(csLine);  
  }  
  catch(...)  
  {  
            AfxMessageBox("打開文件錯");  
  }  
參考一段代碼:使用ifstream  
  char*   pszPath   =   NULL;  
  ::GetMacroBasePath(&pszPath);  
  ifstream   file;  
  file.open(pszPath,ios::nocreate|ios::in);  
  if(pszPath)   delete   pszPath;  
  if(!file.good())   return   rtnValue;  
   
  char   buffer[256];  
  file.getline(buffer,255);  
  if(_stricmp(buffer,"VERSION   =   1.0")   !=   0)  
  return   rtnValue;  
   
  CString   strTemp(_T(""));  
  file.getline(buffer,255);  
  while(_stricmp(buffer,"")   !=   0)  
  {  
  strTemp   =   CString(buffer);  
                                      。。。  
                                      file.getline(buffer,255);  
                      }  
CStdioFile   f;  
  CFileException   e;  
  char   *FileName   =   "temp.txt";  
  if(   !f.Open(   FileName,   CFile::modeRead,   &e   )   )  
  {   return;}  
  CString   line;  
  while   (f.ReadString(line))  
  {  
  }  
  f.Close();
char   szT[256];  
  memset(   szT,   0,   256   );  
  fp   =   fopen(   "test.txt",   "r"   );  
   
  fscanf(   fp,   "%s",   szT   );  
  strcpy(   szcc,   szT   );  
  while(   !feof(   fp   )   )  
  {  
  fscanf(   fp,   "%s",   szT   );  
  strcat(   szcc,   szT   );  
  }  
  fclose(   fp   );  
  CStdioFile   file;  
  CString   str;  
  file.Open("c:/1.txt",CFile::modeRead);  
  while(file.ReadString(str))  
  {  
          //從文件中讀出的內容寫到了str中;  
          //做想做的事情;  
  }  
FILE*   fp;  
  char   cRead[1024]={0};    
  fp=fopen("test.txt","wt");  
  while(!feof(fp))  
  {  
          fget(cRead,500,fp);  
          ......  
  }  
 FILE   *in;  
  char   *ret;  
  char   txtPath[200];////path   and   file   name  
  char   buff[200];  
  if((in=fopen(txtPath,"r"))==NULL)  
  {  
  MessageBox("/nOpen   txt   file   failure!/n");  
  return;  
  }  
  while(!feof(in))  
  {  
  ret=fgets(buff,200,in);////從文本文件中讀取一行的文本  
  if(ret==NULL)   break;  
                    ////  
                    other   operation  
                    ////  
  }  
  fclose(in);  
   
#include<fstream>//使用C++標準庫  
  using   namespace   std;  
   
  struct   Record  
  {  
      int   id;  
      char   name[256];  
      char   other[256];//CString類本身有指針,讀寫麻煩,容易出錯。固用數組  
  };  
   
  //寫入文件  
  struct   Record   info;  
  ofstream   outbal("test.bat",ios::out|ios::binary)//二進制打開,默認爲文本  
  if(!outbal)  
  {  
      return   false;//打開文件失敗  
  }  
  outbal.write((char   *)&info,sizeof(struct   info));  
  outbal.close();  
   
  //讀取文件  
  struct   Record   info;  
  ifstream   inbal("test.bat",ios::in|ios::binary)//二進制打開,默認爲文本  
  if(!inbal)  
  {  
      return   false;//打開文件失敗  
  }  
  inbal.read((char   *)&info,sizeof(struct   info));//讀取到變量info中,如果文件有多組值,可用循環  
  inbal.close();  
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define PATHNAME "E:/1.txt"
#define COUNT 2064

int getMark(char*, char[]);
int getAttr(char* , float[], int*);
int checkData(char*);

int main(int argc, char* argv[])
{
int* pMark = NULL;
float* pAttr[COUNT];
char* buff = NULL;
char ch[9];
float attr[24];
int i = 0;
int icnt;

FILE* pf = NULL;

if (!(pf = fopen(PATHNAME, "r+"))) {
printf("error!!!");
return 0;
}


pMark = new int[COUNT];
if (!pMark) {
printf("error!!!");
return 0;
}
memset(pMark, 0, COUNT*sizeof(int));

buff = new char[256];
if (!buff) {
printf("error!!!");
return 0;
}
memset(buff, 0, 256*sizeof(char));

while (!feof(pf) && i < COUNT) { // 1.判斷文件是否到了結尾 2.判斷讀取行數是否超過COUNT
pAttr[i] = new float[24];
if (!pAttr[i]) {
printf("error!!!");
return 0;
}
memset(pAttr[i], 0, 24*sizeof(float));
i++;

fgets(buff, 256, pf); // 讀取256字節數據或者到一行結束的數據

if (checkData(buff) == -1)
continue;

memset(ch, 0, 9*sizeof(char));
getMark(buff, ch); // 得到每行的第一個數據裏
*(pMark + i - 1) = atoi(ch); // 寫到第一個數組裏

memset(attr, 0, 24*sizeof(float));
getAttr(buff, attr, &icnt); // 得到每行的其它數據後,存在數組attr裏
memcpy(pAttr[i - 1], attr, (icnt+1)*sizeof(float)); // 將數組attr中的數據拷貝到第二個數組裏

}


/*
1.txt:
1, 0.056183, 0.015906, 0.003513, 0.000283, 0.000003, 0.000828, 0.111811
1, 0.020147, 0.005431, 0.001509, 0.000059, 0.000003, 0.000797, 0.111808
2, 0.026044, 0.001199, 0.001091, 0.000081, 0.000003, 0.000794, 0.111806
2, 0.090909, 0.008505, 0.003210, 0.001535, 0.000004, 0.000909, 0.111562
3, 0.354464, 0.198575, 0.028486, 0.024844, 0.000663, 0.012116, 0.113298
3, 0.552498, 0.364998, 0.240247, 0.210239, 0.047230, 0.130700, 0.010317

*(pMark+0) = 1;
*(pMark+1) = 1;
*(pMark+2) = 2;
*(pMark+3) = 2;
*(pMark+4) = 3;
*(pMark+5) = 3;
...

*(pAttr[0]+0) = 0.056183
*(pAttr[0]+1) = 0.015906
...
*(pAttr[1]+0) = 0.020147
*(pAttr[1]+1) = 0.005431
...
*/
delete [] pMark;
delete [] buff;
for (int j = 0; j < i; j++) {
delete [] pAttr[j];
}

fclose(pf);
return 0;
}

int checkData(char* buff)
{
/*
此處爲數據格式check,過程省略。
現在默認你的數據都是合法的,如果有非法數據此程序可能會出錯,此時必須對數據格式進行check
buff:
1, 0.056183, 0.015906, 0.003513, 0.000283, 0.000003, 0.000828, 0.111811
*/
return 0;
}

int getMark(char* buff, char ch[])
{
int iLength = strlen(buff);
for (int i = 0; i < iLength; i++) {
if (buff[i] == ',') {
memcpy(ch, buff, i);
break;
}
}

return 0;
}

int getAttr(char* buff, float attr[], int* icnt)
{
char ch[9];
int iLength = strlen(buff);
*icnt = -1;
int istart = 0;
int iend = 0;
for (int i = 0; i < iLength; i++) {
if (buff[i] == ',') {
iend = i;
(*icnt)++;

if (*icnt < 1) {
istart = iend;
continue;
}

memset(ch, 0, 9*sizeof(char));
memcpy(ch, buff + istart + 2, 8);
attr[*icnt - 1] = (float)atof(ch);
istart = iend;
}

}
return 0;
}


VC對文本文件的操作- CFile沒有ReadString和WriteString函數,只有CStdioFile纔有,這也許是筆誤。
但問題的解決方法恰巧在這裏:不要用CStdioFile,而應該使用CFile,用Read和Write成員函數,雖然多一個參數,但是卻能夠實現你所說的功能。這是因爲CStdioFile從嚴格意義上來說與CFile相差太大,其對文件操作的函數實際上都是調用的標準I/O函數,而CFile中調用的則是SDK函數,這就導致執行的效果和適用的範圍上會有所差別。
另外要特別指出的是,要想將該讀取的行全部置爲0,還需要在調用了Read之後先調用Seek函數將文件指針移回到該行行首再調用Write函數執行寫入的操作,否則會導致寫入位置的錯誤。還要特別注意在CFile中讀寫文件必須處理回車符!
示範代碼如下:
CFile file;
CString sTmp, t("0000000000/n");
int iLen = t.GetLength();
file.Open("data.txt", CFile::modeReadWrite);
file.Read(sTmp.GetBuffer(iLen), iLen);
sTmp.ReleaseBuffer();
file.Seek(-iLen, CFile::current);
file.Write(t, iLen);
file.Close();
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章