C/C++ 仿iApp字符文件操作 源码

一、目的: 

相对于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;
    }
}

三、 备注:

  1. UTF-8和GBK编码转换部分参考自:https://blog.csdn.net/u010871058/article/details/70229091
  2. 文件夹/文件列表读取部分参考自:https://blog.csdn.net/qq_22494029/article/details/79288923 
发布了34 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_40471574/article/details/99679550