//文件复制功能(包括文本文件和二进制文件) #include<stdio.h> #include<stdlib.h> int copyFile(char *fileRead, char *fileWrite); int mian(int argc, char const *argv[]) { char fileRead[100];//要复制的文件名 char fileWrite[100];//复制后的文件名 //获取用户输入 printf("要复制的文件:"); scanf("%s",fileRead); printf("复制后的文件:"); scanf("%s",fileWrite); //进行文件复制 if (copyFile(fileRead,fileWrite)) { printf("恭喜,复制成功!\n"); }else{ printf("抱歉,复制失败!\n"); } return 0; } /** *文件复制函数 *@parameter fileRead 要复制的文件 *@parameter fileWirte 复制后的文件 *@return 1:复制成功 -1:复制失败 **/ int copyFile(char *fileRead, char *fileWrite) { FILE *fpRead;//指向要复制的文件 FILE *fpWrite;//指向复制后的文件 int bufferLen = 1024*4;//缓冲区长度; char *buffer=(char *)malloc(bufferLen);//开辟缓存 int readCount;//实际读取的字符数 if ((fpRead=fopen(fileRead,"rb"))==NULL||(fpWrite=fopen(fileWrite,"wb"))==NULL) { printf("Cannot open file, press any key to exit!\n"); getch(); exit(1); } //fileRead 不断读取内容,放在缓冲区,再将缓存区的内容写入fileWrite while((readCount=fread(buffer,1,bufferLen,fpRead))>0){ fwrite(buffer,readCount,1,fpWrite); } free(buffer); fclose(fpRead); fclose(fpWrite); return 1; } //********************************* //C语言获取文件大小(长度) //C 语言,如何实现文件的增删改查? #include<stdio.h> #include<conio.h> #include<stdlib.h> long fsize(FILE *fp); int main(int argc, char const *argv[]) { long size = 0; FILE *fp=NULL; char filename[30]="D:\\1.mp4"; if ((fp=fopen(filename,"rb"))==NULL) { printf("Filed to open %s\n", filename); getch(); exit(EXIT_SUCCESS); } printf("%ld\n",fsize(fp) ); return 0; } long fsize(FILE *fp) { long n; fpos_t fpos;//当前位置 fgetpos(fp,&fpos);//get当前位置 fseek(fp,0,SEEK_END); n=ftell(fp); fsetpos(fp,&fpos);//恢复之前文件指针位置 return n; } //文件复制函数 /** * 文件复制函数 * @param fSource 要复制的原文件 * @param offsetSource 原文件的位置偏移(相对文件开头),也就是从哪里开始复制 * @param len 要复制的内容长度,小于0表示复制offsetSource后边的所有内容 * @param fTarget 目标文件,也就是将文件复制到哪里 * @param offsetTarget 目标文件的位置偏移,也就是复制到目标文件的什么位置 * @return 成功复制的字节数 **/ long fcopy(FILE *fSource, long offsetSource, long len, FILE *fTarget, long offsetTarget){ int bufferLen = 1024*4; // 缓冲区长度 char *buffer = (char*)malloc(bufferLen); // 开辟缓存 int readCount; // 每次调用fread()读取的字节数 long nBytes = 0; //总共复制了多少个字节 int n = 0; //需要调用多少次fread()函数 int i; //循环控制变量 fseek(fSource, offsetSource, SEEK_SET); fseek(fTarget, offsetTarget, SEEK_SET); if(len<0){ //复制所有内容 while( (readCount=fread(buffer, 1, bufferLen, fSource)) > 0 ){ nBytes += readCount; fwrite(buffer, readCount, 1, fTarget); } }else{ //复制len个字节的内容 n = (int)ceil((double)((double)len/bufferLen)); for(i=1; i<=n; i++){ if(len-nBytes < bufferLen){ bufferLen = len-nBytes; } readCount = fread(buffer, 1, bufferLen, fSource); fwrite(buffer, readCount, 1, fTarget); nBytes += readCount; } } fflush(fTarget); free(buffer); return nBytes; } //文件内容插入函数 /** * 向文件中插入内容 * @param fp 要插入内容的文件 * @param buffer 缓冲区,也就是要插入的内容 * @param offset 偏移量(相对文件开头),也就是从哪里开始插入 * @param len 要插入的内容长度 * @return 成功插入的字节数 **/ int finsert(FILE *fp, long offset, void *buffer, int len){ long fileSize = fsize(fp); FILE *fpTemp; //临时文件 if(offset>fileSize || offset<0 || len<0){ //插入错误 return -1; } if(offset == fileSize){ //在文件末尾插入 fseek(fp, offset, SEEK_SET); if(!fwrite(buffer, len, 1, fp)){ return -1; } } if(offset < fileSize){ //从开头或者中间位置插入 fpTemp = tmpfile(); fcopy(fp, 0, offset, fpTemp, 0); fwrite(buffer, len, 1, fpTemp); fcopy(fp, offset, -1, fpTemp, offset+len); freopen(FILENAME, "wb+", fp ); fcopy(fpTemp, 0, -1, fp, 0); fclose(fpTemp); } return 0; } //文件内容删除函数 int fdelete(FILE *fp, long offset, int len){ long fileSize = getFileSize(fp); FILE *fpTemp; if(offset>fileSize || offset<0 || len<0){ //错误 return -1; } fpTemp = tmpfile(); fcopy(fp, 0, offset, fpTemp, 0); //将前offset字节的数据复制到临时文件 fcopy(fp, offset+len, -1, fpTemp, offset); //将offset+len之后的所有内容都复制到临时文件 freopen(FILENAME, "wb+", fp ); //重新打开文件 fcopy(fpTemp, 0, -1, fp, 0); fclose(fpTemp); return 0; } //********************************* //C语言模拟密码输入 #include<stdio.h> #include<conio.h> #include<ctype.h> # define PWDLEN 20 void getpwd(char *pwd, int pwdlen); int main(int argc, char const *argv[]) { char pwd[PWDLEN+1]; printf("Input password: "); getpwd(pwd, PWDLEN); printf("The password is:%s\n",pwd ); return 0; } /** *获取用户密码 *@parameter pwd char* 保存密码的内存的首地址 *@parameter pwdlen int 密码的最大长度 **/ void getpwd(char *pwd, int pwdlen) { char ch = 0; int i = 0; while(i<pwdlen){ ch = getch();//之所以使用 getch() 来获取字符,是因为该函数既没有回显也没有缓存, if (ch=='\r') //回车结束输入 { printf("\n"); break; } if (ch=='b'&& i>0) //按下删除键 { i--; printf("\b \b");//退格,输出空格,再退格就能覆盖前面的星号。 }else if(isprint(ch)){ //输入可打印字符 pwd[i]=ch; printf("*"); i++; } } pwd[i]=0; } //********************************* //顺序表的增删改查基本操作 #include<stdio.h> #include<stdlib.h> #define Size 5 typedef struct Table { int *head; int length; int size; }table; table initTable(){ table t; t.head=(int *)malloc(Size*sizeof(int)); if(!t.head){ printf("初始化失败!\n"); exit(0); } t.length=0; t.size=Size; return t; } table addTable(table t, int add, int elem){ if(add>t.length+1||add<1){ printf("插入的位置有问题!\n"); return t; } if(t.length>=t.size){ t.head=(int *)realloc(t.head,(t.size+1)*sizeof(int)); if(!t.head){ printf("realloc fail!!!\n"); } t.size+=1; } for(int i=t.length-1;i>=add-1;i--){ t.head[i+1]=t.head[i]; } t.head[add-1]=elem; t.length++; return t; } table deleteTable(table t,int add){ if(add>t.length||add<1){ printf("delete fail!\n"); return t; } for(int i=add;i<t.length;i++){ t.head[i-1]=t.head[i]; } t.length--; return t; } int selectTable(table t, int elem){ for(int i=0;i<t.length;i++){ if(t.head[i]==elem){ return i+1; } } return -1; } table modifyTable(table t, int elem, int newElem){ int add=selectTable(t,elem); t.head[add-1]=newElem; return t; } void displayTable(table t){ for(int i=0;i<t.length;i++){ printf("%d ",t.head[i] ); } printf("\n"); } int main(int argc, char const *argv[]) { table t1=initTable(); for(int i=1;i<=Size;i++){ t1.head[i-1]=i; t1.length++; } printf("原来的顺序表是:\n"); displayTable(t1); printf("删除元素1:\n"); t1=deleteTable(t1,1); displayTable(t1); printf("在第2的位置插入元素5:\n"); t1=addTable(t1,2,5); displayTable(t1); printf("查找元素为3的位置:\n"); int add=selectTable(t1,3); printf("%d \n", add); printf("将元素3 改为6:\n"); t1=modifyTable(t1,3,6); displayTable(t1); return 0;