C语言网

 找回密码
 加入社区!

QQ登录

只需一步,快速开始

查看: 784|回复: 2

[分享] 计算机_C语言_文件读取_学习笔记 [复制链接]

Rank: 6Rank: 6

主题
68
帖子
348
C币
578 枚
在线时间
57 小时
发表于 2010-8-26 09:02:28 |显示全部楼层
计算机_C语言_文件读取_学习笔记
一、文件操作类型
   1、文件创建
   2、文件写入
   3、文件读取
   4、文件删除
二、文件
1、文件的定义: 文件是磁盘上一段命名的存储区。
     例如: stdio.h就是一个包含信息的文件的名称
2、C中文件的解释
     在C中, 文件被看成是连续的字节序列,每一个字节均可单独的读取。(这种解释与Unix的文件结构一致)
     两种文件格式:
     1)文本文件
     2)二进制文件
3、文本文件
   在文本文件中,程序看到的内容和文件的内容有可能不同。
      例如: 使用文本文件格式时,当读取文件的时候,将把行尾的本地环境表示法映射为C的格式;
             同时在输出的时候也会将C的文件中的行尾映射为本地环境表示法。
             即:   MS—DOS文本文件用 \r\n 表示行尾
                    Macintosh文件只用一个\r表示行尾
                    而在C的文件格式里面用\n表示为行尾。
             因此用C读取这三种文件格式时会进行行尾标识转换。会在本地环境表示法和C语言的表示法之间进行转换。
   MS—DOS区别文本文件和二进制文件,当在MS—DOS下用二进制格式处理文本文件时不会发生环境表示法的映射,并且可以分别出\r\n.
   建议对二进制文件就用二进制的方法处理,而对文本文件就用文本文件的方法处理。
4、二进制文件
     在二进制文件中,文件可以以字节为单位访问。
5、I/O级别
     文件除了有文件格式的分别,还有I/O级别之分(即两种处理文件存取的级别)
     1) 低级I/O(low level I/O)使用操作系统提供的基本I/O服务。
     2) 标准高级I/O(standard high level I/O)使用标准的C库函数包和stdio.h头文件中的定义。
6、标准文件
     C程序执行时会自动打开3个与设备有关的文件: 标准输入、标准输出、标准错误输出
     1)标准输入:通常为键盘
           标准输入文件是: getchar()、 gets()、scanf()读取的文件
     2)标准输出:系统的一般输出设备, 通常为显示器
           标准输出文件是: putchar()、 puts()、 printf()输出的文件
     3)标准错误输出: 系统的一般输出设备, 通常为显示器
           标准错误输出提供一个可供发送错误信息的逻辑上不同的位置。
7、标准I/O
     1)标准输入输出相对低级I/O的优势
          标准输入输出包中有很多专用的函数
          对输入输出进行缓冲
     2)putc和putchar函数、以及getc和getchar函数的区别
          其实putchar()函数是利用宏定义putc()函数。
             #define  putchar(ch)   putc(ch ,stdout)
          putc()函数可以向数据流写入内容,而putchar()函数仅可以向标准输出设备写入内容。
          同样getchar()函数是利用宏定义的getc()函数
             #define  getchar()    getc(stdin)
           getc()函数可以从数据流读取数据,而getchar()函数仅可以从标准输入设备读取内容
     3)关于return和exit的联系和区别
          在程序中任意地方调用exit均会结束程序, 而只有在main函数里面调用return才会结束程序。
       即在main函数里面调用exit和使用return语句具有同样的效果。
8、fopen()函数
       在C程序中要读写文件,第一步就是打开文件,C中提供标准函数用来打开文件, fopen()就是其中的一个;
       fopen在stdio.h中声明。
       fopen()函数接受两个参数:
            第一个参数:是要打开的文件的文件名, 即包含该文件名的字符串的地址。
            第二个参数:用来指定文件打开模式的字符串。
       模式字符串:
         r:打开文本文件,可以读取文件
         w:打开一个文本文件,可以写入文件,先将文件的长度截为0。然后再写入,如果文件不存在就创建它。
         a:打开一个文本文件,可以写入文件,向已有的文件尾部追加内容, 如果文件不存在就创建它。
         r+:打开一个文本文件,可以进行更新, 也即可以读取和写入文件
         w+:打开一个文本文件,可以进行更新(读取和写入),如果该文件存在则首先将其截为0,如果不存在就创建它。
         a+:打开一个文本文件,可以进行更新(读取和写入),向已有文件追加内容,如果文件不存在就创建它。
       还有: rb、wb、ab、ab+、a+b,wb+、w+b,其中r、w、a、+的意义与前面一致,只是b表示是打开二进制文件。
    1)如果fopen()函数成功打开一个文件,那么就返回一个文件指针, 其他的I/O函数利用这个fopen()返回的指针进行文件
       操作。
    2)文件指针是指向FILE类型的指针, FILE是在stdio.h文件中定义的一种结构体类型。
    3)fopen()函数返回的指针并不指向实际的文件,而是指向一个关于文件的信息的数据包,其中包括文件I/O使用的缓冲区的   
       信息,。标准函数库的文件I/O函数使用缓冲区,需要知道缓冲区的位置和缓冲区的缓冲能力以及所使用的文件,标准函数
       库中的文件I/O函数可以填充和清空缓冲区。
    4)如果fopen()函数不能打开文件,将返回一个空指针。
9、文件结尾
    从文件中读取数据时,当达到文件结尾需要停止,C中如何知道文件已经到达文件结尾了呢?
    用
    1)ch=getc(fp); 当到达文件结尾时getc()函数返回一个EOF(End of File)值,表示文件结尾。
    2)也可利用feof()函数判断是否到达文件结尾, 当到达文件结尾时feof()函数返回非零值,
        当还没有到达文件结尾时,feof()函数返回0。
10、fclose()函数
    当进行完文件读写后需要关闭所打开的文件,在C中利用库函数fclose()函数可以关闭以打开的文件。
    1) fclose(fp), 表示关闭由文件指针fp指向的文件, 同时根据需要刷新缓冲区。
    2) 文件成功关闭fclose()函数返回0, 否则返回EOF。
    3)磁盘已满、磁盘被移走或I/O错误都会导致文件关闭失败。
11、标准文件指针
    在标注库函数stdio.h中定义了3个文件指针自动与C程序打开的三个标注文件进行关联。
    1)  标注输入输出文件     文件指针     一般使用的设备
            标准输入          stdin          键盘
            标准输出          stdout         显示器  
            标准错误输出      stderr         显示器  
    2)标准文件指针都是FILE指针,因此都可以当做标准库函数的参数。
12、fprintf()和fscanf()函数。
      标准文件I/O函数fprintf()和fscanf()函数的工作方式与printf()及scanf()函数的工作方式相同,
     1)fprintf函数的调用格式:
            fprintf(文件指针,格式化字符串,待输出的参数列表);
        EXP:  fprintf(fp,“%d%s%f”,iNum,strName,fScore);
     2)fscanf函数的调用格式:
            fscanf(文件指针,格式化字符串,接受输入值的参数列表);
        EXP:  fscanf(fp,“%d%s%f”,&iNum,strName,&fScore);
     通常fprintf()和fscanf()函数适合用于数据格式固定的数据的写入和读取。
13、fgets()和fputs()函数
     1)fgets(()函数用来从文件或或者设备文件读取数据,fgets()函数有参数:
          第一个参数: 和gets()函数一样,fgets()函数的第一个参数用于存储输入地址,为char *型。
          第二个参数: 为整数,表示输入字符串的最大长度。
          第三个参数: 为文件指针,指向要读取的文件。
        Exp:
                 fgets(buf,MAX,fp); //其中buf为字符数组首地址, MAX为要读入字符串的最大长度,
                                           fp为用fopen打开的文件指针。
           fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个字符,
         或者读取到文件结尾,然后fgets()函数向末尾添加一个空字符'\0'以构成一个字符串,因此字符串
         的最大长度代表字符的最大数目在加上一个空字符'\0'。如果fgets()函数在达到最大字符数目之前
         读取完了一行,那么fgets()函数将在字符串的空字符前添加一个换行符以表示一行结束。
            fgets()函数遇到EOF的时候返回NULL值,可以用来检测文件结尾, 否则fgets()返回传递给它的
         地址值。
     2)fputs()函数用来向文件输出或写入数据,fputs()函数接受两个参数:
            第一个参数: 表示待输出的数据的地址, 为字符串地址
            第二个参数: 为一个文件指针。
          fputs()函数把字符串地址指针所指向的字符串写入指定的文件。与puts()函数不一样的是,fputs()
        函数在打印的时候并不添加一个换行符。
        Exp:
             fputs(buf,fp);
    3)注释:gets()和fgets()
         fgets()函数可以防止存储溢出,所以对于严格的编程来说是一个更好的选择。fgets()函数将换行符读取到
       字符串,puts()会在输出中追加一个换行符,因此fgets()应该和fputs()函数配合。当fgets()和puts()
       使用时会输出两个换行符。(不处理的话)
14、随机存取: fseek()和ftell()函数
        fseek()函数可以和数组类似的处理文件,用来在fopen()打开的文件中直接移动到任意字节处,fseek()函数接受
     三个参数,并且返回一个int值, ftell函数以一个long型值返回一个文件当前的位置。
    1)fseek()函数
         第一个参数: 为指向被搜索文件的文件指针。应该用fopen()函数打开了该文件
         第二个参数: 为偏移量Offset, 表示从起始点开始要移动的距离,这个参数是一个long型的值, 可以为正(前移)、      
                      也可为为负(后移), 也可以为零(保持不动)
         第三个参数: 是模式,用来表示起始点。
               模式              偏移量的起始点
             SEEK_SET              文件开始 (0L)    //后面的0L表示如果不用SEEK_SET宏的话,那么可以用0L代替。
             SEEK_CUR              当前位置 (1L)
             SEEK_END              文件结束 (2L)
       如果调用成功,fseek()函数返回值为0, 如果有错,那么就会返回-1。
    2)ftell()函数
        为long型返回值的函数, 它返回文件当前的位置。在ANSI下,ftell()函数在stdio.h头文件中声明。ftell()函数
       通过返回距文件开始处的字节数目来确定文件的位置。文件的第一个字节到文件开始处的距离为0,以此类推。这样适合
       处理以二进制格式打开的文件。
   3)可移植性
       在文本模式下,下面的fseek()调用是确定有效的:
            fseek(file,0L,SEEK_SET);   到文件开始
            fseek(file,0L,SEEK_CUR);   当前位置不动
            fseek(file,0L,SEEK_END);   到文件结尾
            fseek(file,ftell-pos,SEEK_SET); 到距文件开始处ftell-pos的位置, ftell-pos是ftell的返回值。

Rank: 3Rank: 3

主题
23
帖子
244
C币
313 枚
在线时间
17 小时
发表于 2011-1-1 15:52:15 |显示全部楼层
挺详细的,看看,谢了
木木竹林

Rank: 1

主题
0
帖子
2
C币
2 枚
在线时间
0 小时
发表于 2011-3-11 12:52:13 |显示全部楼层
初学者受教了
您需要登录后才可以回帖 登录 | 加入社区!

C语言 ( 粤ICP备11042647号-2 )

GMT+8, 2012-2-7 23:05

©2009-2011 cyuyan.com.cn

回顶部