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);
-------------------------------------------------------------
文件的读写还涉及到文件的编码问题,最常见的莫过于UNICODE和ANSI了,因此你用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;
}