C语言 文件操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第9章 文件操作
9.1 计算机中的流 9.2 文件 9.3 基本文件操作 9.4 高级文件操作
9.1 计百度文库机中的流
▪ 计算机中的流的概念
➢ 一般称为数据流,也有叫做字节流、比特流的, 还有很具体的文件流、视频流、音频流等
▪ 时光不能倒流,但计算机中的很多流都是会 倒流的
➢ 如果想重新读已经读过的数据,或要修改已经写 入的数据,可以发出流控(Flow Control)命令
3.文➢文件本分文类件:便于根对据字文符件进中行数处据理和的输存出放,组但织是形占存式储分空类间。较多,
需➢要A花SC费II字文符件变:换即时文间本。文件,每字节存放一字符的 ➢二A进S制CI文I码件,能代够表节一省个存字储空符间。和变换时间,但不能以字符形
式直接 例输:出,12适34合56保,存占中6个间字结节果,。存放6个字符的ASCII码。
➢ 不会倒流的数据流也很多,如网络上的数据流。 网络和数据线等介质只有很小的数据缓冲区,没 有大量存储的能力。
第9章 文件操作
9.1 计算机中的流 9.2 文件 9.3 基本文件操作 9.4 高级文件操作
9.2 文件
1.文件的概念 ▪ 文件是存储在外部介质上数据的集合。 ▪ 操作系统通过文件对数据进行管理:
➢ 二进制文件:存放数据的二进制编码,是一个字节 序列,与数据在内存中的存储形式相同。
例:123456,在二进制文件中占4个字节,存放 123456的二进制数。
4.文件的格式
▪ 数据必须按照存入的类型读出,才能恢复其 本来面貌。
▪ 公开的标准格式
➢ 如bmp、tif、gif、jpg和mp3等类型的文件 ,有大 量软件能生成和使用这些类型的文件。
文件缓冲区
➢从内存向磁盘输出数据
程序数据区
输出文件缓冲区 装满缓冲区
磁盘
输入文件缓冲区
文件缓冲区
➢从磁盘向计算机读入数据
程序数据区
输出文件缓冲区
磁盘
输入文件缓冲区 充满缓冲区
第9章 文件操作
9.1 计算机中的流 9.2 文件 9.3 基本文件操作 9.4 高级文件操作
9.3 基本文件操作
▪ 基本模式: ➢ open:打开文件,获得对此文件的指针、引用和句柄等 ➢ read:读文件,参数一般指明读多少字节,读到哪块内存。 每次调用此功能,都是接着上次调用的结束位置读(所 以是个输入流)
#in【clru例edtue9r<.n3s-bt1r】i;ng读.h>出test.bin文件。
#d}efine FILENAME "test.bin" #dperfinetf(M"TAhXe_iSnTt RisIN%Gd_\nL"E,NbGloTcHk.i)3; intpRrienatfd(D"Tahtae(ifnlotafht ,isvo%idf\*n"b,ubf,loinctkl.ef)n; ); strpurcint tdfa("tTahe string is %s\n", block.string); { pirnitnit;f("The end is %s\n", block.end);
2.读文件 int read(int handle, void *buf, unsigned len);
例: int n_read = read(fd, buf, BUFSIZ);
➢ 从文件中读len个字节存到buf开始的地址单元中; ➢ handle是open获得的文件句柄; ➢ buf是保存读入内容的内存指针; ➢ len是最大可以读入的字节数; ➢ 返回值为实际读入的字节数,可能小于len。返回0表示读到 了末尾,返回-1表示出错;
▪ 也有不公开、甚至加密的文件格式
➢ 如Microsoft Word的doc格式就不公开,所以至今 还没有Word以外的其它软件能完美地读出doc文 件。
5. 文件处理系统
C系统在处理文件时,并不区分类型,都 看成是字节流,以字节为单位进行存取。
➢ 缓冲文件系统:高级文件系统,系统自动为 正在使用的文件开辟内存缓冲区。(ANSI C 标准采用)
第9章 文件操作
▪ 在前面的章节中,数据都是存储在变量、 数组等对象中,程序结束后数据将丢失, 无法长期保存。
▪ 本章将介绍如何使用文件管理数据。
▪ 学习目标
➢ 掌握文件基本概念 ➢ 熟悉文件操作函数
打开、关闭、读、写、定位等
▪ 重点
➢ 文件操作函数
fopen、fread、fwrite、fseek等
▪ 出错处理int fh = open("c:\\abc.abc", O_RDONLY | O_BINARY);
➢ 打印错if (误fh信==息-1给) 用户// 因,c等:\a待bc用.ab户c不的存处在理,。fh必然为-1
{ perror("Can't open c:\\abc.abc. Error");
fcllooastef(;fh); crehtaurrnst0ri;ng[MAX_STRING_LENGTH + 1]; // 为\0多留出一个字节 } char end[4]; } int main(void) { struct data block; int fh, rtn; fh = open(FILENAME, O_RDONLY | O_BINARY); if (fh == -1) { perror(FILENAME);
3.写文件 ▪ int write(int handle, void *buf, unsigned len);
例: int n_write = write(fd, buf, BUFSIZ); ➢ 把从buf开始的len个字节写入文件; ➢ handle是open获得的文件句柄; ➢ buf是要写入内容的内存指针; ➢ len是写入多少字节; ➢ 返回值为实际写入字节数,可能小于len。返回-1表示出错。 4. 关闭文件 ▪ int close(int handle);
while ( readBytes < len ) {
val = read( fh, ((char*)buf)+readBytes, len-readBytes ); if (val == -1)
return val; else if (val != 0)
floraettfu=rn1-010;.0; c} har string[] = "100"; irntnt f=h,wrrtinte; (fh, "END", strlen("END")+1); iffh(r=tnop<e0n)(FILENAME, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 06{66)p;error(FILENAME); if (rfehtu=r=n-1-1); {} perror(FILENAME); clorseetu(frhn);-1; }return 0; } rtn = write(fh, &i, sizeof(i)); if (rtn < 0) { perror(FILENAME);
➢ 成功返回移位后的当前位置,从文件头算起;否则返回-1L;
几个巧妙运用:
A. curPos = lseek(fh, 0L, SEEK_CUR); 得到当前位置指针的位置;
B. fileLength = lseek(fh, 0L, SEEK_END); 得到文件长度。
9.3.2 错误处理
#include <stdio.h>
例: int pos = lseek(fd, 100L, SEEK_CUR);
➢ handle是open获得的文件句柄;
➢ offset是相对fromwhere的位置偏移多少,可以为负数;
➢ fromwhere:SEEK_SET-----文件开始
SEEK_CUR-----当前位置
SEEK_END-----文件末尾
➢ write:写文件,参数一般指明把哪块内存的内容写入文件 ,要写多少字节。
每次调用此功能,都是接着上次调用的结束位置写 (所 以是个输出流)
➢ close:关闭文件,操作结束,不再使用此文件。 文件使用完毕必须关闭,否则影响系统性能。
➢ seek:文件定位:随机控制流的当前位置
#include <io.h> #include <fcntl.h> 1.打开文件 int open(const char *pathname, int access,unsigned mode);
对使用者而言,只要知道文件的 路径(全目录)和文件名,就能 使用该文件 C:\home\Sunner\main.c
A: C: D:
home Sunner Secrets getnum.h getnum.c main.c 苏小红
Software TC20 WinZip
Backup main.c
E:
voi}drepteurrnro-1r;(co//n返st回c错h误ar值*给s系);统
➢ 向标准错误输出字符串s,随后附上错误的文字说明。
return 0; }
9.3.3 程序示例 #inrctnlu=dew<ristetd(fiho,.h&>f, sizeof(f));
#inifc(lurtdne<<0e)rrno.h> #in{clupderero<rio(F.hIL>ENAME); #inclruedtuer<nfc-1n;tl.h>
#in【}clu例de9<.2satr】ing编.h>程建立和读入图9-2所示的test.bin文件。
#dretfnin=ewFrILitEe(NfhA,MsEtri"ntge,sst.ibzieno"f(string)); intifm(ratinn(<vo0i)d) { {intpie=rr1o0r0(F;ILENAME);
例: int ret = close(fd); ➢ 把遗留在缓冲区中的数据写入文件; ➢ handle是open获得的文件句柄; ➢ 关闭成功返回0,否则返回-1(驱动器中无盘或盘空间不 够时会引起关闭失败)。
5.文件定位 ▪ long lseek(int handle, long offset, int fromwhere);
return -1; }
9.3.3 程序示例 #inrctnlu=deRe<asdtdDioat.ha(>fh, &block, sizeof(block));
#inifc(lurtdne<<0e)rrno.h> #in{clupderero<rio(F.hIL>ENAME); #inclculdoese<(ffchn);tl.h>
➢ 根据文件名将文件调入内存,对文件中的数据 进行处理。
▪ 使用文件的目的: (1)保存数据:包括程序运行中间数据和结果。 (2)将程序与数据分离:数据文件改动不影响程序。 (3)数据共享:不同程序可访问同一文件中数据。
2. 文件的存放 可以建立若干目录(文件夹),
在目录里保存文件,同一级目录 里保存的文件不能同名。
例:int fd = open("C:\\CONFIG.SYS", O_RDWR | O_CREAT);
➢ pathname是文件名,包含路径。如果不含路径,表示打开当前目 录下的文件; ➢ access是打开方式,常用为O_RDONLY、O_WRONLY、 O_RDWR与O_CREAT、O_TRUNC、O_APPEND的或运算; ➢ 返回值为文件句柄(File Handle),留待以后使用。如果打开失 败,返回值为-1。
▪ 错误处#in理clude <errno.h>
➢ 文件##ii错nnccll误uudd一ee <<般ifoc是.nht>l外.h>界造成的,出错率很高,如文件被删除、 修改、磁盘空间满、被其他文件打开等,程序无法控制。
▪ 通过判int断ma返in(回vo值id)发现错误
{
➢ 所有文// c件:\a操bc作.a出bc错文件时并都不返存回在-1。
return -1; }
// 从fh读入len字节长的数据到buf。在不出错和未读到末尾的情况下保证读满 len个字节。 // 出错返回-1,否则返回实际读入的字节数 int ReadData(int fh, void* buf, int len) {
int readBytes = 0; // 已经读入的字节数 int val;
相关文档
最新文档