fseek(fp, 0, SEEK_END);
unsigned long len = ftell(fp);  //这就是长度了.


使用函数filelength(FILE*)就行了。

filelength是系统相关的,头文件io.h

#include <stdlib.h>
#include <io.h>

FILE *fpFile;
char *cpTemp;
long lFileLen;
fpFile = fopen("file.txt", "rb");
lFileLen = filelength(fpFile->fd);
cpTemp = (char*)malloc(lFileLen*sizeof(char));   //文件长度超过64k的话要分多段
fread(cpTemp, sizeof(char), iFileLen, fpFile);

---------------------------------------------------

filelength函数原型:long filelength(int handle)  

按搂上方式...
FILE *fpFile;         // FILE标识的定义在头文件<stdio.h>中
long lFileLen;
fpFile = fopen("file.txt", "rb");
lFileLen = filelength(fpFile);  // 在tc2.0中调试有错误!参数不匹配!
fclose(fpFile);

修改之后...
int handle;
long lFileLen;
handle = open("file.txt", O_RDONLY);  // O_RDONLY标识在<fcntl.h>中
lFileLen = filelength(handle);       // OK!
......

----------------------------------------------------------------

噢,忘了filelength是使用低级句柄的。不过也可以不使用open来打开文件,可以:

iFileLen = filelength(fpFile->fd);

转换为低级句柄,就OK了。

试了不行

 

------------------------------

void Cv12e1_FileView::OnFileRead()
{
// TODO: Add your command handler code here
//FILE * pFile = fopen("1.txt", "r");
FILE * pFile;
fopen_s(&pFile, "1.txt", "r");
// TCHAR ch[100];
// memset(ch, 0, 100);
// fread(ch, 1, 100, pFile);
// MessageBox(ch);
TCHAR * pBuf;
fseek(pFile, 0, SEEK_END);
int len = ftell(pFile);
pBuf = new TCHAR[len + 1];
//fseek(pFile, 0, SEEK_SET);
rewind(pFile);
fread(pBuf, 1, len, pFile); 
pBuf[len] = 0;
MessageBox(pBuf);
fclose(pFile);
文件是以unicode编码保存的
Debug的时候:
如果用数组来保存读取的信息,ch就是文件中的数据,
如果用pBuf,pBuf里面除了原有的数据,后面还加上了一串乱码,
是这里fread(pBuf, 1, len, pFile);有问题吗?
有人知道是怎么回事吗?

 

#define _UNICODE

fopen_s(&pFile, "1.txt", "r");
unicode编码 要用 2 进制方法打开。 "rb".

len = ftell(pFile) ; -- 单位 byte

fread(pBuf, sizeof(TCHAR), len/sizeof(TCHAR), pFile);

 

-------------------------------------------------------------

文件的读写还涉及到文件的编码问题,最常见的莫过于UNICODEANSI了,因此你用ReadString读取一行当然会出错.
参考以前写的一个:
bool CReadFile::ReadLine(char* buffer, int count)
{
assert(fp);
assert((buffer)&&count>0);
if(feof(fp))
return false;
string s;
if(GetFileCodeType()==ansi)//单字节文件
{
char c;
while(!feof(fp))
{
c=fgetc(fp);
if(c==13)
{
fgetc(fp);//跳过一个字节char(10)
break;
}
s.append(1,c);
}
}
else //宽字节编码文件
{
if(GetPos()==0)
fseek(fp,2,0);//跳过文件开始的编码声明的两个字节
wchar_t wc;
wstring ws;
while(!feof(fp))
{
fread(&wc,1,2,fp);
locale loc("chs");
wcout.imbue(loc);
if(wc==0x000A)
break;
ws.append(1,wc);
}
CUser u;
s=u.WstringToString(ws);
}
int len=s.size();
if(len>count)//截断处理
len=count;
memcpy(buffer,s.c_str(),len);
buffer[len]='\0';
return true;
}