- 主题
- 68
- 帖子
- 348
- 精华
- 0
- 积分
- 635
- C币
- 578 枚
- 在线时间
- 57 小时
- 注册时间
- 2010-7-9
- 最后登录
- 2012-1-28
- 性别
- 保密
 
- 主题
- 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的返回值。 |
|