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();