zoukankan      html  css  js  c++  java
  • C文件操作

    
    
    1.    首先要理解几个概念:
    
    文件: 按一定规则存储在磁盘上的数据集合。
    
    文件名: 能唯一标识某个磁盘文件的字符串。形式: 盘符:/ 路径 / 文件名.扩展名
    
    文本文件:: 数据以其数字字符的ASCII码形式、一个字节一个字节地存储在磁盘上。
    
    二进制文件:数据以二进制形式在存储在磁盘上。
    
    设备文件:输入/输出设备
    
    标准输入文件:键盘
    
    标准输出文件/标准错误输出文件:显示器
    
    文件型指针:C语言是通过名为FILE的结构型指针来管理文件读写的。FILE *<变量名>
    
    文件的打开和关闭 :文件操作先建立文件与文件指针之间的关系,接着进行文件的读与写。建立文件与文件指针之间的联系的过程是文件的打开。终止这种联系就是文件的关闭。
    
    FILE结构:定义在〈stdio.h〉中。形式如下:
    
    typedef struct
    
    {
    
    int  _fd;   /*文件代号*/
    
    int  _cleft;       /* 文件缓冲区所剩字节数*/
    
    int  _mode;    /* 文件使用模式*/
    
    char  *nextc;     /* 下一个等待处理的字节地址, 即文件内部指针*/
    
    char  *buff;    /*  文件缓冲区首地址  */
    
    }FILE;
    
    2. 主要操作函数用相应的使用
    
    1) 文件的打开与关闭:
    
    #include <stdio.h>
    
    FILE *fp;
    
    fp = fopen(char* filename,  char*  made);
    
    if(fp == NULL)
    
    {
    
    exit(0);
    
    }
    
    fclose(fp)
    
    mode和种类有:
    
    r : 打开一个文本文件,供读取数据, 文件不存在,则返回NULL
    
    w : 建立一个供写入的文本文件. 废弃原有内容
    
    a: 打开或建立一个把数据追加到文件尾的文本文件
    
    r+: 更新数据
    
    w+ : 更新数据,废弃原有内容
    
    a+ : 更新数据, 写入的数据追加到文件尾.
    
    二进制在后面加"b"
    
    标准输入/输出文件的文件型指针:  stdin, stdout, stderr
    
    2)   文件的读与写:
    
    把一个字符写入文件, 或从文件中读取一个字符:  文件内部指针自动移向下一位可读写的位置
    
    int fputc(char ch, FILE *fp); //成功返回写入的字符, 失败返回EOF
    
    int fgetc( FILE *fp)    //成功则返回写入的字符
    
    把一行数据写入文件, 或读取一行数据:
    
    int  fputs(char *str, FILE *fp)     //成功返回0
    
    char *  fgets(char *str, int n, FILE *fp) ; // 读取N-1 个字符,第N个字符补'/0' ,成功返回读取的字符串。
    
    把指定字节数的若干数据写入文件, 或读出文件.
    
    int fwrite(char * buf, unsigned size, unsigned n, FILE *fp); size 每个数据的字节数,  n 个数据. 成功返回写入字符的个数。
    
    int fread(char *buf, unsigned size, unsigned n, FILE *fp);   成功返回读取字符的个数。
    
    把指定格式的数据写入文件, 或读取指定格式的数据
    
    int fprintf(FILE *fp, char *format, e1,e2,......en);   成功返回写入字符的个数
    
    int fscanf(FILE *fp, char *format, e1,e2,......en);  成功返回读取字符的个数
    
     
    
    3) 文件位置的确定与指针管理.
    
     
    
    文件尾的测试:  int feof(FILE *fp); //当前已到达文件尾返回非0, 否则返回0
    
    不同的计算机系统以不同的键盘组合键形成文件的结束符. IBM PC及其兼容机是<ctrl> + z
    
     
    
    把文件内部指针重新定位到文件的起始位置     int rewind(FILE *fp);
    
     
    
    把文件内部指针定位到指定的位置:   int fseek(FILE *fp, long offset, int from);  //成功返回0
    
    from 是定位的起始点.
    
    SEEK_SET    0    从文件头开始
    
    SEEK_CUR    1    从文件内部指针当前位置开始
    
    SEEK_END    2   从文件尾开始
    
    offset 是以From 为起始点的依稀字节数,大于0表示向文件尾方向, 0 不移动,
    
     
    
    文件操作出错测式   int ferror(FILE *fp); 
    
    用于对由FP指向的文件最近一次操作进行正确性测试. 出错返回非0,还没返回0
    
     
    
    4)  文件的删除
    
    int remove(char * filename);
    
     
    
      3.  一些以前我没想到的知识点.
    
    char ch;
    
    ch = getchar ()  功能等价于 ch = fgetc(stdin)  功能等价于 scanf("%c",ch)   功能等价于 fscanf(stdin, "%c",ch)
    
    putchar(ch)  功能等价于 printf("%c",ch)   功能等价于 fputc(stdout)   功能等价于 fprintf(stdout, "%c", ch)
    
    注意 : 这些函数存在的一些细微的差别。注意它们的返回值的不同。
    
    
    

    1
    #include <iostream> 2 #include <stdio.h> 3 #include <windows.h> 4 5 using namespace std; 6 7 8 void main() 9 { 10 FILE* fp = NULL; 11 int nFileLen = 0; 12 13 fp = fopen("D:\1.txt","w"); 14 15 if(fp==NULL) 16 { 17 return; 18 } 19 20 //fseek and ftell 21 22 23 /* fseek(fp,0,SEEK_END); 24 25 26 int nFileLen = ftell(fp);*/ 27 28 29 char a = fgetc(fp); 30 while(a!=EOF) 31 { 32 nFileLen++; 33 34 a = fgetc(fp); 35 } 36 37 38 39 rewind(fp); 40 41 cout<<nFileLen<<endl; 42 43 44 char* szBuffer = new char[nFileLen+20]; 45 46 47 fseek(fp,0,SEEK_SET); 48 //rewind(fp); 49 50 51 //fgetc fputc //by Character 52 //fgets fputs //by stream 53 //fread fwrite //by block 54 55 56 fread(szBuffer,nFileLen,1,fp); 57 58 szBuffer[nFileLen] = ''; 59 60 cout<<szBuffer<<endl; 61 62 63 64 65 66 67 68 69 fclose(fp); 70 71 72 fp = fopen("D:\1.txt","a"); 73 74 if(fp==NULL) 75 { 76 return; 77 } 78 79 80 81 fwrite(szBuffer,nFileLen,1,fp); 82 83 84 85 fclose(fp); 86 87 delete szBuffer; 88 89 // ERROR_SUCCESS 90 91 // int a = GetLastError(); 92 93 // printf("\"); 94 95 96 97 int i = 0; 98 99 char szFileName[20] = {0}; 100 for(i=0;i<1000;i++) 101 { 102 103 memset(szFileName,0,20); 104 strcpy(szFileName,"D:\"); // D:\; 105 itoa(i,&szFileName[strlen(szFileName)],10); 106 107 strcat(szFileName,".txt"); 108 109 fp = fopen(szFileName,"w"); 110 111 112 fwrite("Hello",5,1,fp); 113 114 115 fclose(fp); 116 } 117 118 119 120 for(i=0;i<1000;i++) 121 { 122 123 memset(szFileName,0,20); 124 strcpy(szFileName,"D:\"); // D:\; 125 itoa(i,&szFileName[strlen(szFileName)],10); 126 127 strcat(szFileName,".txt"); 128 129 130 DeleteFile(szFileName); 131 132 // fp = fopen(szFileName,"w"); 133 134 135 // fwrite("Hello",5,1,fp); 136 137 138 // fclose(fp); 139 } 140 141 }
  • 相关阅读:
    无线渗透开启WPS功能的路由器
    写代码怎能不会这些Linux命令?
    分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
    Innodb 中的事务隔离级别和锁的关系
    线上操作与线上问题排查实战
    MySQL 四种事务隔离级的说明
    一次由于 MTU 设置不当导致的网络访问超时
    SYN 和 RTO
    The story of one latency spike
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3360449.html
Copyright © 2011-2022 走看看