第十三章文件对数据的管理无论是用链表还是数组,都是存贮在显存中的,程序结束后就会遗失,下一次运行程序时,要重新输入或运算生成数据。要把程序运行的数据保存上去便于上次运行继续使用,在计算机中持久保存数据的方法是借助文件保存。13.1文件概述文件通常是指储存在外部介质上数据的集合。文件以数据方式储存在外部介质上,操作系统以文件为单位对数据进行管理。想找到存在外部介质上的数据linux系统日志,必须按文件名找到指定的文件之后再从该文件中读取数据。要想在外部介质上储存数据必须先构建一个文件(以文件名标示),能够向它输出数据。从操作系统角度,每一个与主机相连的输入输出设备都可以被看作一个文件。在程序运行时,往往须要将一些数据(运行的最终结果或中间数据)输出到c盘上保存,之后要用时再从c盘中输入到计算机的显存,这就要用到c盘文件。操作系统的文件标示包括三部份:(1)文件路径:表示文件在外部储存设备中的位置。(2)文件名:遵照标示符的命名规则。(3)文件扩充名:表示文件的性质(.txt.dat.c)。如:d:c++tempflie1.dat文件操作是一种典型的IO操作(输入输出操作)。
输入输出是针对显存而言的,进显存为输入,出显存为输出。标准输入输出就是标准输入设备(鼠标)和标准输出设备(显示器),鼠标和显示器就是一种文件。C语言将文件看成字符(字节)的序列,即由一个一个字符(字节)的数据次序组成。C语言中对文件的存取是以字符(字节)为单位的,输入输出数据流的开始和结束仅受程序控制不受物理符号控制(如回车换行符)。输出时不会手动降低回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(实际上C文件不是由记录构成的),这些文件称为流式文件。ANSI新标准文件采用缓冲方法,系统手动地在显存区为每一个正在使用的文件开辟一个缓冲区。从显存向c盘输出数据必先送到输出缓冲区,装满缓冲区后才一起送到c盘。从c盘向显存输入数据先送到输入缓冲区,程序须要数据时去缓冲区读取,若缓冲区无数据,则程序步入阻塞状态(等待数据)。C语言把数据看作是一连串的字符(字节),按照数据的组成型式,分为ASCII文件和二补码文件。文本文件又称ASCII文件,每位字节储存一个ASCII码,代表一个字符。如1、2的ASCII码分别为49、50,所以整数12用ASCII文件储存时,储存方式为00010二补码文件是直接用数据的二补码方式储存的,即把显存中的数据按其在显存中的储存方式原貌输出到c盘上储存。
程序中实现对文件的处理一般分三步:(1)打开文件:将程序与文件构建联系。(2)操作文件:对文件进行读写操作,即输入输出。(3)关掉文件:操作完成应该切断文件与程序的联系。C语言中没有输入输出句子,对文件的读写都是用库函数实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写,这种函数的申明包含在头文件stdio.h中。13.2文件的打开与关掉文件进行读写操作前先要打开,使用完毕要关掉。打开文件,是构建文件的各类有关信息,并使文件表针指向该文件,便于进行其他操作。关掉文件则断掉表针与文件之间的联系。1.打开文件(fopen函数)原型:FILE*fopen(char*filename,char*mode);FILE是在stdio.h头文件中定义的一个结构体,拿来保存文件信息。fopen函数拿来打开一个文件,其调用的通常方式为:文件表针名=fopen(文件名,使用文件形式);其中:·“文件表针名”必须是被说明为FILE类型的表针变量。·“文件名”是被打开文件的文件名,是字符串常量或字符串链表。·“使用文件形式”是指文件的类型和操作要求。
如:FILE*fp;fp=fopen("file1.txt","r");其意义是在当前目录下打开文件file1.txt,只容许读操作,并使fp指向该文件。又如:FILE*fp;fp=fopen("c:\file2.txt","rb");意义是打开C驱动器c盘根目录下的文件file2.txt,对其按二补码形式进行读操作。两个反斜线\中的第一个表示通配符字符,第二个表示根目录。文件打开方法r只读打开一个文本文件,只容许读数据w只写打开或构建一个文本文件,只容许写数据a追加打开一个文本文件,并在文件末尾写数据r+读写打开一个文本文件,准许读和写w+读写打开或构建一个文本文件,准许读和写a+读写打开一个文本文件,准许读和在文件末尾写数据rb只读打开一个二补码文件,只容许读数据wb只写打开或构建一个二补码文件,只容许写数据ab追加打开一个二补码文件,并在文件末尾写数据rb+读写打开一个二补码文件,准许读和写wb+读写打开或构建一个二补码文件,准许读和写ab+读写打开一个二补码文件,准许读和在文件末尾写数据(1)文件使用方法由r、w、a、b、+拼成,含意分别为:r(read)读w(write)写a(append)追加b(binary)二补码文件+读和写(2)用r形式打开文件时文件必须存在,只能从该文件读出。
(3)用w形式打开只能向文件写入。若打开的文件不存在,则以指定的文件名构建新文件。若存在,则将存在的文件删掉,重建新文件。(4)向一个已存在的文件追加新的信息,只能用a形式打开。文件必须存在,否则会出错。(5)打开文件出错时fopen将返回一个空表针值NULL。程序中可用这一信息判定是否完成打开文件的工作,并做相应的处理。因而常用以下程序段打开文件:if((fp=fopen("c:\file2.txt","rb"))==NULL){printf("nerroronopenc:\file2.txt!");exit(0);}(6)把文本文件读入显存时linux 文件描述符,要将ASCII码转换成二补码码。把显存数据以文本形式写入c盘时,要将二补码码转换成ASCII码。因而文本文件的读写耗费较多的转换时间,对二补码文件的读写不存在这种转换。(7)标准输入文件(鼠标)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。2.关掉文件(fclose函数)文件使用完毕,应用关掉文件函数把文件关掉,因而把缓冲区的数据写入文件中。否则程序结束时可能导致数据遗失。
fclose函数使用方式:fclose(文件表针);如:fclose(fp);正常完成关掉文件操作时,fclose函数返回值0。发生错误时返回EOF。13.3文件读写对文件的读和写是最常用的文件操作,在C语言标准库中提供了多种文件读写的函数。字符读写函数:fgetc和fputc字符串读写函数:fgets和fputs数据块读写函数:fread和fwrite低格读写函数:fscanf和fprintf13.3.1字符读写函数1.读字符函数fgetc尺寸:intfgetc(FILE*stream);功能:从指定的文件中读一个字符。参数:stream为指向文件的表针。返回值:从stream所指的文件流中读取一个字符,转换为int类型返回。若已到文件尾返回EOF,文件状态改为结束状态。若读错误返回EOF,文件改为错误状态。EOF在stdio.h中定义为-1。诸如:ch=fgetc(fp);其含意是从打开的文件fp中读取一个字符并送入ch中。对于fgetc函数的使用有几点说明:(1)在fgetc函数调用中嵌入式linux 培训,读取的文件必须是以读或读写方法打开的。
(2)文件内部有一个位置表针,拿来指向文件的当前读写字节,文件打开时,位置表针总指向文件的第一个字节。使用fgetc函数后位置表针向后联通一个字节。因而可连续多次使用fgetc函数读取多个字符。文件表针是指向整个文件的linux 文件描述符,要在程序中定义说明,只要不重新形参文件表针值不变。文件内部的位置表针用于指示文件内部的当前读写位置,每读写一次,位置表针向后联通,它无需在程序中定义说明,由系统手动设置。例:读取文本文件file.txt,把其中所有非空格字符输出在标准输出设备上。#includeio.h>#includeio.h>#includeintmain(){FILE*fp;charch;if((fp=fopen("file.txt","r"))==NULL){printf("nCan'topenfile,strikeanykeyexit!");getch();/*等待敲鼠标,显示Can'topenfile,strikeanykeyexit!*/exit(1);/*结束程序*/}ch=fgetc(fp);while(ch!=EOF)/*文件结束时读取得到EOF*/{if(ch!='')putchar(ch);ch=fgetc(fp);}fclose(fp);return0;}