C语言---文件IO操作

简介: C语言---文件IO操作
//文件复制功能(包括文本文件和二进制文件)
#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;
相关文章
|
16天前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
16天前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
1月前
|
搜索推荐 索引
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
33 2
|
1月前
|
编解码 Java 程序员
【文件IO】文件内容操作
【文件IO】文件内容操作
42 2
|
1月前
|
存储 Java API
【文件IO】文件系统操作
【文件IO】文件系统操作
40 1
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
34 0
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南