一、目的:
相对于c这种底层的古老语言,iApp提供的iyu语法在进行字符和文件操作的时候真的超级方便。之前是打算在课设开始之前,先写好相关的字符和文件操作函数,到时候用起来方便些。结果到真正用的时候发现用起来bug百出,iApp和C的机制隔阂太大了,iApp提供的一些思想根本没法在c里很好的应用,结果最后只用上了一个fw()函数。但如果只是单纯的对文本数据进行操作,用这些函数还是很方便的。
二、 函数代码:
#include <bits/stdc++.h>
#include <windows.h>
#include <direct.h>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)
{
wchar_t * lpUnicodeStr = NULL;
int nRetLen = 0;
if(!lpUTF8Str) return 0;
nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,NULL);
lpUnicodeStr = new WCHAR[nRetLen + 1];
nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen);
if(!nRetLen) return 0;
nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,NULL,NULL,NULL);
if(!lpGBKStr)
{
if(lpUnicodeStr) delete []lpUnicodeStr;
return nRetLen;
}
if(nGBKStrLen < nRetLen)
{
if(lpUnicodeStr) delete []lpUnicodeStr;
return 0;
}
nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL);
if(lpUnicodeStr) delete []lpUnicodeStr;
return nRetLen;
}
int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen)
{
wchar_t * lpUnicodeStr = NULL;
int nRetLen = 0;
if(!lpGBKStr) return 0;
nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL);
lpUnicodeStr = new WCHAR[nRetLen + 1];
nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen);
if(!nRetLen) return 0;
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL);
if(!lpUTF8Str)
{
if(lpUnicodeStr) delete []lpUnicodeStr;
return nRetLen;
}
if(nUTF8StrLen < nRetLen)
{
if(lpUnicodeStr) delete []lpUnicodeStr;
return 0;
}
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL);
if(lpUnicodeStr) delete []lpUnicodeStr;
return nRetLen;
}
int fr(char * filename,char re[])
{
char *a,*b;
FILE *p;
p=fopen(filename,"r");
if(p==NULL) return -1;
fseek(p,0,2);
int len=ftell(p);
a=(char *)calloc(len*10,sizeof(char));
b=(char *)calloc(len*10,sizeof(char));
rewind(p);
fread(a,sizeof(char),len,p);
a[len]='\0';
UTF8ToGBK((unsigned char *)a,(unsigned char *)b,len);
strcpy(re,b);
free(a);
free(b);
fclose(p);
return 1;
}
int fe(char *filename,int *re)
{
FILE *p;
p=fopen(filename,"r");
if(p==NULL) *re=-1;
else
{
fclose(p);
*re=1;
}
}
int fw(char *filename,char *word)
{
char *utf8word=NULL,*a,*b;
FILE *p;
p=fopen(filename,"w");
if(p==NULL) //创建文件夹
{
char *file=NULL;
int flag=0;
file=(char *)calloc(strlen(filename)+1,sizeof(char));
for(int i=0;i<strlen(filename);i++)
{
file[i]=filename[i];
if(filename[i]=='/')
{
file[i+1]='\0';
if(flag==1) mkdir(file);
flag=1;
}
}
free(file);
p=fopen(filename,"w");
if(p==NULL) return -1;
}
int len = GBKToUTF8((unsigned char *)word,NULL,NULL);
utf8word=(char *)calloc(len,sizeof(char));
GBKToUTF8((unsigned char *)word,(unsigned char *)utf8word,len);
fputs(utf8word,p);
free(utf8word);
fclose(p);
return 1;
}
int fs(char *filename,int *re)
{
FILE *p;
p=fopen(filename,"r");
fseek(p,0,2);
int sizen=ftell(p);
*re=sizen;
}
int fd(char *filename,int *re)
{
int r=remove(filename);
if(r==0) *re=1;
else *re=-1;
}
void ss(char *a,char *b)
{
strcat(a,b);
}
void ssg(char code[],int l,int r,char soncode[])
{
int fact_l=0,fake_l=0;
for(int i=0;code[i]!='\0';i++)
{
if(fake_l==l) break;
fact_l++;
fake_l++;
if(code[i]<0)
{
fact_l++;
i++;
}
}
int wordsum=r-l+1;
int wordnum=0;
int sonlo=0;
for(int i=fact_l;code[i]!='\0';i++)
{
if(code[i]<0) //对中文的处理
{
soncode[sonlo++]=code[i];
soncode[sonlo++]=code[i+1];
i++;
}
else soncode[sonlo++]=code[i];
wordnum++;
if(wordnum==wordsum)
{
soncode[sonlo]='\0';
break;
}
}
}
void siof(char code[],char findcode[],int *loca)
{
*loca=-1;
int flag;
int real_loca=-1;
for(int i=0;code[i]!='\0';i++)
{
flag=0;
if(code[i]==findcode[0])
{
flag=1;
for(int j=i;findcode[j-i]!='\0';j++)
{
if(code[j]!=findcode[j-i])
{
flag=0;
break;
}
}
}
if(flag==1)
{
for(int j=0;j<=i;j++)
{
real_loca++;
if(code[j]<0) j++;
}
*loca=real_loca;
break;
}
}
}
void slof(char code[],char findcode[],int *loca)
{
*loca=-1;
int flag;
int real_loca=-1;
int codelen=strlen(code);
for(int i=codelen-1;i>=0;i--)
{
flag=0;
if(code[i]==findcode[0])
{
flag=1;
for(int j=i;findcode[j-i]!='\0';j++)
{
if(code[j]!=findcode[j-i])
{
flag=0;
break;
}
}
}
if(flag==1)
{
for(int j=0;j<=i;j++)
{
real_loca++;
if(code[j]<0) j++;
}
*loca=real_loca;
break;
}
}
}
void slg(char code[],int *len)
{
int realen=0;
for(int i=0;code[i]!='\0';i++)
{
realen++;
if(code[i]<0) i++;
}
*len=realen;
}
void sr(char code[],char repla[],char replato[])
{
char *p1,*p2;
int p1_end=0,p2_start=0,p2_len,code_len;
siof(code,repla,&p1_end);
while(p1_end!=-1)
{
p1=(char *)calloc(strlen(code)+strlen(replato),sizeof(char));
p2=(char *)calloc(strlen(code)+strlen(replato),sizeof(char));
slg(repla,&p2_len);
slg(code,&code_len);
if(p1_end>0) ssg(code,0,p1_end-1,p1);
else strcpy(p1,"");
p2_start=p1_end+p2_len;
ssg(code,p2_start,code_len-1,p2);
strcat(p1,replato);
strcat(p1,p2);
strcpy(code,p1);
free(p1);
free(p2);
siof(code,repla,&p1_end);
}
}
void getAllFiles(string path, vector<string>&files, string fileType)
{
long hFile = 0;
struct _finddata_t fileInfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + fileType).c_str(), &fileInfo)) != -1)
{
do files.push_back(p.assign("").append(fileInfo.name));
while (_findnext(hFile, &fileInfo) == 0);
_findclose(hFile);
}
files.erase(files.begin());
files.erase(files.begin());
}
可以将其打包成文件通过文件包含使用,函数的作用和iApp里的一样。附调用实例:
int main()
{
//fr();成功返回1,失败返回-1
char codes[1000];
fr("data.html",codes);
//fw();成功返回1,失败返回-1
fw("d:/vers/data.txt","我爱你ya");
//fe();存在值为1,不存在为-1
int exisit;
fe("d:/vers/data.txt",&exisit);
//fs();单位为B,文件不存在值为-1
int sizen;
fs("d:/vers/R.y",&sizen);
//fd() 成功值为1,失败值为-1
int del;
fd("d:/ver/data.txt",&del);
//ss() 必须用数组,不能用char型指针,返回到s1上
char s1[11]="bo";
char s2[3]="ao";
ss(s1,s2);
//siof() 从前往后找,loca为-1说明没找到
int loca;
siof(codes,"lang",&loca);
//slof() 从后往前找,loca为-说明没找到
slof(codes,"lang",&loca);
//ssg() 所有参数必须写全(已对中文进行处理)
char soncode[1000];
ssg(codes,0,128,soncode);
//sr()
sr(codes,"测试","");
//slg() 已对中文处理
int len;
slg(codes,&len);
vector<string>temp; //获取文件/文件夹列表
getAllFiles("F:/软件库/java/压缩包汇总", temp,"");
for (int i = 0; i < temp.size(); i++)
{
cout << temp[i] << endl;
}
}
三、 备注:
- UTF-8和GBK编码转换部分参考自:https://blog.csdn.net/u010871058/article/details/70229091
- 文件夹/文件列表读取部分参考自:https://blog.csdn.net/qq_22494029/article/details/79288923