| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
1、从文本流与二进制流到文本文件与二进制文件 
流: 在声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。 
while((getc(fp))!=EOF) putchar(ch); 
看这个循环,可以读取一个文件的所有字符。如果不是流的话,ch永远是第一个字符,不会更新。也可以理解为,fp自动++(一个字符的大小)。  
          C 语言把这个文件指针称为流,其含义是表达该指针会自动移动来方便读写文件。 
        所谓文本流是指在流中流动的数据是以字符形式出现。在文本流中,'/n'被换成回车CR和换行LF的代码0DH和0AH。而当输出时,则0DH和0AH本换成'/n'。 
         二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。在流入流出时,对/n符号不进行变换。例如2001这个数,在文本流中用其ASCII码表示为: 
            '2' '0' '0' '1' 
            |  |  |  | 
            50  48  48  49 
共占4字节。而在二进制流中则表示为:00000111 11010001  用十六进制就是07D1,只占两字节。 
        计算机中数据都是以二进制存储的,文本流和二进制流的本质在于程序处理数据的方式不一样,而在选择读写模式后,流会自动帮你处理。 
        二进制流处理的文件是二进制文件,文本流处理的文件是文本文件。它们在文件的组织形式上也不一样,二进制文件有文件头(File Header),用以表明文件的大小、类型等信息,程序在处理二进制文件时一般会先分析文件头,判断文件是否合法,也就是说,文件头后面的数据才是程序真正要处理的;字符文件没有文件头,第一个字节就是要显示的内容。 
2、文件读写函数 
1.按字节读写 
         int fgetc(FILE *stream) ; 
         int fputc(int char, FILE *stream); 
2.按行读写 
        char *fgets(char *str, int n, FILE *stream);      // fgets:读取一行(包括'\n'), 并在结尾自动加上'\0',如果正常执行则返回传入的buf指针 
        int fputs(const char *str, FILE *stream); 
fget()函数采用内存打包技术,把内存首地址str和内存块的大小n一块传给被调函数,这样在被调函数内便可很好的操作主调函数分配的内存空间。 
3.按块读写 
        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);  //从给定流 stream 读取数据(size*nmemb个字节)到 ptr 所指向的内存空间; 
        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); // 把 ptr 所指向的内存空间中的(size*nmemb个字节)数据写入到给定流 stream 中. 
统一使用: 
        size_t fread(void *ptr, n, 1, FILE *stream);  //从给定流 stream 读取数据n个字节到 ptr 所指向的内存空间; 
        size_t fwrite(const void *ptr, n, 1, FILE *stream); // 把 ptr 所指向的内存空间中的n个字节数据写入到给定流 stream 中. 
 
3、文件其他操作 
1.打开文件 
        FILE *fopen(const char *filename, const char *mode); 
模式优先选用:"a+", "ab+"; 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符不保留)。  
2.关闭文件 
        int fclose(FILE *stream); 
关闭流 strea关闭流 stream,刷新所有的缓冲区。 
3.文件结束标志 
        int feof(FILE *stream); 
测试给定流 stream 的文件结束标识符,结束则返回0. 
4.重设文件指针 
        int fseek(FILE *stream, long int offset, int whence); 
设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。 
whence参数可选: SEEK_SET-->文件的开头;    SEEK_CUR-->文件指针的当前位置 ;  SEEK_END-->文件的末尾 
5.重置文件指针 
        void rewind(FILE *stream); 
设置文件位置为给定流 stream 的文件的开头。 
6.获取文件位置 
        long int ftell(FILE *stream); 
返回给定流 stream 的当前文件位置。 
4、格式化输入输出 
1.格式化输出到文件。 
        int fprintf(FILE *stream, const char *format, ...); 
发送格式化输出到流 stream 中。传送门 
2.格式化输出字符串 
        int sprintf(char *str, const char *format, ...); 
发送格式化输出到 str 所指向的字符串。传送门 
3.格式化读取文件 
        int fscanf(FILE *stream, const char *format, ...); 
        从流 stream 读取格式化输入。传送门 
4.格式化读取字符串 
        int sscanf(const char *str, const char *format, ...); 
从字符串读取格式化输入。传送门 |   
 
 
 
 |