lfread——读入文件到宽字节数组中
// 得到某字符串中的某字符串的个数
int findstrnum(const char* old_str, const char* find_str)
{
const char* p;
int num = 0;
while (1)
{
p = strstr(old_str, find_str);
printf("%s\n", p);
while (p != NULL)
{
num++;
p = p + strlen(find_str);
p = strstr(p, find_str);
}
break;
}
return num;
}
/*
GetCHSNum
得到char*中中文的个数
pchar 原字符串
返回值 中文个数
\*/
int GetCHSNum(char pchar[])
{
int num = 0;
for (unsigned int i = 0; i < strlen(pchar); i++)
{
if (pchar[i] < 0)
{
num++;
i++;
}
}
return num;
}
// 宽字节读取器
size_t lfread(TCHAR* str, size_t size, FILE* fp)
{
char* text = new char[size + 1];
sprintf_s(text, 1, "");
size_t i = fread(text, size, 1, fp);
// 由于fread将中文当作一个字节读取,所以如果文件中包含中文,读出来的字符串末尾会含 <文件中的中文个数> 个乱码
//
// 所以这里要向下取整得到字符串中的中文个数,又因为末尾含 <文件中的中文个数> 个乱码,所以字符串中一半的中文都
// 是乱码,所以要除以2,然后就得到了准确的中文个数,然后再将乱码的那部分删除,由于乱码位于末尾,就在尾部加\0
// 截去乱码部分
text[size - (GetCHSNum(text) - 1) / 2] = '\0';
// char 转为 wchar_t
MultiByteToWideChar(CP_ACP, 0, text, strlen(text), str, size - (findstrnum(text, "\n") + findstrnum(text, "\r")));
delete[] text;
return i;
}
和fread的用法几乎毫无差别,不过去掉了_ElementCount参数(原来在fread中的第三个参数,表示读入次数,此处默认设置为1)
请读取ANSI编码文件!否则中文乱码!
使用示例
FILE* fp;
// 打开文件
if (fopen_s(&fp, "./read.txt", "rt+") != NULL)
{
throw;
}
// 保存文件内容
TCHAR wch[1024] = { 0 };
// 读入文件(使用宽字节读取器)
lfread(wch, _filelength(_fileno(fp))/* 得到文件总长 */, fp);
// 关闭文件
fclose(fp);
fread_p——解决fread读取文件结尾出现乱码问题
确保你读取的是ANSI编码文件,否则中文还是乱码。
/*
GetCHSNum
得到char*中中文的个数
pchar 原字符串
返回值 中文个数
\*/
int GetCHSNum(char pchar[])
{
int num = 0;
for (unsigned int i = 0; i < strlen(pchar); i++)
{
if (pchar[i] < 0)
{
num++;
i++;
}
}
return num;
}
// 读取文件
size_t fread_p(char* str, size_t size, FILE* fp)
{
sprintf_s(str, 1, "");
size_t i = fread(str, size, 1, fp);
str[size - (GetCHSNum(str) - 1) / 2] = '\0';
return i;
}
用法和lfread一样,只不过是读取到char*中,和fread的最大区别就是没有乱码。
参考:
得到中文个数 http://www.huidong.xyz/index.php?mode=2&id=99
MultiByteToWideChar函数:http://www.huidong.xyz/?mode=2&id=48
得到指定字符个数 http://www.huidong.xyz/index.php?mode=2&id=94