第一种方法: 也可以读取一个不定长的文件。
FILE pFile = fopen( pFilePath, \"r\" );
if ( pFile == NULL )
{
return 0;
}
fseek( pFile, 0, SEEK_END );
iFileLen = ftell( pFile );
rewind( pFile );
m_pFileText = new char[iFileLen+1];
fread( m_pFileText, 1, iFileLen, pFile );
m_pFileText[iFileLen] = 0;
fclose( pFile );
第二种方法:
// 计算字符个数
FILE pFile = fopen( pFilePath, \"r\" );
char ch;
int num = 0;
while ( ch = getc( pFile ) != EOF )
{
num++ ;
}
fclose( pFile );
使用fread函数读取指定长度的字符串,即使包含\n也会被读取,可以首先使用fseek定位到文件结尾,然后ftell函数返回的值就是文件的大小,这样就可以用循环多次读取文件,直到读取所有内容
FILE file = NULL;
char szFile[1025] = {0};
int nHadRead = 0;
file = fopen( "filetxt", "r+");
if ( file == NULL )
return;
fseek( file, 0, SEEK_END ); //定位到文件尾
int nLen = ftell( file ); //获取当前位置,即文件长度
fseek( file 0, SEEK_SET ); //重新定位到文件开头,准备开始读
while ( nHadRead < nLen )
{
int nRead = nLen - nHadRead >1024 1024 : nLen - nHadRead; //如果剩余小于1024字节,则读剩余字节,否则每次读取1024字节。
int nTmp = fread( szFile, 1, nRead , file );
nHadRead += nTmp;
printf( "%s", szFile );
memset( szFile, 0x0, sizeof(szFile) );
}
fclose(file);
大致过程就是这样,纯手打,没有调试过,可能有错
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx
10xxxxxx
3字节:1110xxxx
10xxxxxx
10xxxxxx
4字节:11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode
Explained"一书中的643。
bool
IsUTF8(const
void
pBuffer,
long
size)
{
bool
IsUTF8
=
true;
unsigned
char
start
=
(unsigned
char)pBuffer;
unsigned
char
end
=
(unsigned
char)pBuffer
+
size;
while
(start
<
end)
{
if
(start
<
0x80)
//
(10000000):
值小于0x80的为ASCII字符
{
start++;
}
else
if
(start
<
(0xC0))
//
(11000000):
值介于0x80与0xC0之间的为无效UTF-8字符
{
IsUTF8
=
false;
break;
}
else
if
(start
<
(0xE0))
//
(11100000):
此范围内为2字节UTF-8字符
{
if
(start
>=
end
-
1)
break;
if
((start[1]
&
(0xC0))
!=
0x80)
{
IsUTF8
=
false;
break;
}
start
+=
2;
}
else
if
(start
<
(0xF0))
//
(11110000):
此范围内为3字节UTF-8字符
{
if
(start
>=
end
-
2)
break;
if
((start[1]
&
(0xC0))
!=
0x80
||
(start[2]
&
(0xC0))
!=
0x80)
{
IsUTF8
=
false;
break;
}
start
+=
3;
}
else
{
IsUTF8
=
false;
break;
}
}
return
IsUTF8;
}
UTF-
16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于
0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF
-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
我测试了你的代码:
#include<stdioh>#include<stringh>
#include<stdlibh>
void main()
{
FILE p=fopen("d:\\jiuibftxt","rt");
int length = 0;
for(;fgetc(p)!=EOF;length++);
fclose(p);
printf("第一种方式,文件长度=%d\n",length);
p=fopen("d:\\jiuibftxt","rb");
fseek(p,0,2);
length=ftell(p);
fclose(p);
printf("第二种方式,文件长度=%d\n",length);
}
文本文件的内容是:
FILE p=("jiuibftxt","rt");
int length;
for(;fgetc(p)!=EOF;length);
FILE p=(jiuibftxt","rb");
int length;
fseek(p,0,2);
length=ftell(p);
程序的输出是:
原因分析:
在windows下,以文本方式写入文件的\n会被转换为\r\n(也就是0x0D0A),输出的时候,\r\n会被转换回\n。
fgetc在读入时会将\r\n转换成一个\n;上面的文本文件有6个回车换行。
所以第一种方式比第二种方式少6
C语言获得文件的长度方式就是第二种:
FILEfp;fp=fopen("localfile","rb");// localfile文件名
fseek(fp,0,SEEK_SET);
fseek(fp,0,SEEK_END);
long longBytes=ftell(fp);// longBytes就是文件的长度
以上就是关于用纯C语言取得文件长度全部的内容,包括:用纯C语言取得文件长度、C语言如何读取文件中指定的某一段、如何读取文件的编码信息 c语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)