1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
/* 文本模式、二进制模式 文本格式、二进制格式 缓冲、非缓冲I/O 顺序存取、随机存取 fopen() getc() putc() exit() fclose() fprintf() fscanf() fgets() fputs() rewind() fseek() ftell() fflush() fgetpos() fsetpos() feof() ferror() ungetc() setvbuf() fread() fwrite() */ // 文件输入/输出 getc() putc() #include <stdio.h> #include <stdlib.h> //exit() int main(int argc, char const *argv[]) { if (argc < 2) { puts("pls key the file name"); return 1; } FILE * fp; FILE * fpout; fpout = fopen("./d.log", "w+"); if ((fp = fopen(argv[1], "r")) == NULL) { puts("file no exists"); // exit()可以关闭文件指针 可以使用宏常量 EXIT_SUCCESS EXIT_FAILURE exit(2); } char c; while( (c = getc(fp)) != EOF ) { putc(c, stdout); putc(c, fpout); } // fclose()关闭文件指针,刷新缓冲区 fclose(fp); fclose(fpout); // 更正规的程序也许还要检查是否成功关闭(磁盘满或被移走或出现I/O错误等会导致fclose()失败) if (fclose(fp) != 0 || fclose(fpout) != 0) { puts("fclose error"); } return 0; } // fseek(fp,long offset,int start) ftell(fp) #include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { FILE *fpin, *fpout; fpin = fopen("./a.php", "rb"); fpout = fopen("./d.log", "a+"); fseek(fpin, 0L, SEEK_END); long i; // ftell返回文件的当前位置,距文件开始处的字节数 // 文件第一个字节到开始处的距离是字节0 // 适用于二进制模式打开的文件,对于文本模式打开获取的值可能不正确(换行回车等) long last = ftell(fpin); char c; for (int i = 1L; i <= last; ++i) { // 偏移量为负表示回退 // SEEK_SET:文件开始 SEEK_CUR:当前位置 SEEK_END:文件结尾 // 返回值为0表示成功 -1表示失败 fseek(fpin, -i, SEEK_END); c = getc(fpin); // 针对window平台 \r\n会输出两个换行,舍去一个 // 不兼容mac,mac下\r表示换行 if (c == '\r') continue; putc(c, fpout); } if (fclose(fpin) != 0 || fclose(fpout) != 0) { exit(1); } return 0; } // int fgetpos(fp, fpos_t * restrict pos) 成功返回0 失败返回非0值 // int fsetpos(fp, const fpos_t * pos) 成功返回0 失败返回非0值 // fpos_t:文件定位类型(file position type),不能是数组类型 #include <stdio.h> int main(int argc, char const *argv[]) { // fseek()和ftell()的一个潜在问题是它们限制文件的大小只能在long类型的表示范围内 FILE *p; fpos_t pos1; // 这里不能用a+ 因为用a+打开时,每次写文件都会被定位到文件的尾部 // 但是a+可以累加输出,而w+会把打开时的内容清空 // 例如本例:两次执行a.exe(w+) c.log中内容为:5234 // 两次执行a.exe(a+) c.log中内容为:1234512345 if((p = fopen("c.log", "w+")) == NULL) { printf("open file error"); return 1; } // 获取一个定位点 if(fgetpos(p, &pos1)) { printf("get pos error"); return 1; } fputs("1234", p); // 设置回刚才的定位点 fsetpos(p, &pos1); // 最终输出5234,1被5替换掉了 fputs("5", p); return 0; } |