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] = '\0'; 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 }