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 }
原文地址:https://www.cnblogs.com/Lee-geeker/p/3360449.html