在C++中有两类文件:外设文件(键盘、显示器、打印机等)和(cin,cout)磁盘文件(fstream.h);
所谓“文件” 是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。
文件通常驻留在外部介质上(如磁盘)上的,有使用时才调入内存中来。
← | 键盘 | ||
→ | 显示器 | ||
内存文件操作→ | 流FILE *FP | ←→ | 磁盘 |
←→ | 磁带机 | ||
→ | 打印机 |
文件(file)是程序设计中一个重要的概念。所谓“文件”一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘)上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到指定的文件,然后再从该文件中读取数据。再向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。
我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。例如,终端键盘是输入文件,显示屏和打印机是输出文件。
除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件。
在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这就要用到磁盘文件。
C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称为文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件是把内在中的数据按其在内存中的存储形式原样输出到磁盘上存入。如果有一个整数1000,在内存中占2个字节,如果按ASCII码形式输出,则占5个字节,而按二进制输出,在磁盘上只占2个字节。
如何让计算机了解用户想要处理的问题,而用户又如何能够得知计算机处理的结果呢?可以用C语言中的输入\输出函数来实现;
是指外设与内存的交互;另外还有内存与外存(文件)的输入输出;
输入:从输入设备(键盘,鼠标,扫描仪)向计算机输入数据.
输出:从计算机向外部输出设备(显示器,打印机)输出数据
C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的
例如:
字符输入函数:getchar
字符输出函数:putchar
格式输入函数:scanf
格式输出函数:printf
字符串输入函数:gets
字数穿输出函数:puts
在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中.
例如:在调用标准输入输出库函数时,文件开头应该有:
#include “stdio.h”
或:
#include <stdio.h>
%d:以带符号的十进制形式输出整数
%o:以八进制无符号形式输出整数
%x:以十六进制无符号形式输出整数
%u:以无符号十进制形式输出整数
%c:以字符形式输出,只输出一个字符
%s:输出字符串
%f:以小数形式输出单,双精度数,隐含输出六位小数
%e:以指数形式输出实数
%g:选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0
L:用于长整型整数,可加在格式符d,o,x,u前面
M(代表一个正整数):数据最小宽度
N(代表一个正整数):对实数,表示输出n位小数;
对字符串,表示截取的字符个数
—:输出的数字或字符在域内向左靠
(1)d格式符。用来输出十进制整数。
几种用法:
① %d:按十进制整型数据的实际长度输出。
② %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
例:printf(″%4d,%4d″,a,b);
若a=123,d=12345,则输出结果为12,312,345
③ %ld:输出长整型数据。
例:long a=135790;/* 定义a为长整型变量*/
printf(″%ld″,a);
① %s。例如:printf(″%s″,″CHINA″)
输出字符串“CHINA”(不包括双引号)。
② %ms,输出的字符串占m列,若串长大于m,则全部输出,若串长小于m,则左补空格。
③ %-ms,若串长小于m,字符串向左靠,右补空格。
④ %m. ns,输出占m列,只取字符串中左端n个字符,输出在m列的右侧,左补空格。
⑤ %-m.ns,n个字符输出在m列的左侧,右补空格,若n〉m,m自动取n值。
有以下几种用法:
① %f。不指定字段宽度,由系统自动指定字段宽度,使整数
部分全部输出,并输出6位小数。应当注意,在输出的数字中
并非全部数字都是有效数字。单精度实数的有效位数一般为7位。
②%m.nf。指定输出的数据共占m列,其中有n位小数。如果
数值长度小于m,则左端补空格。
③%-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。
除了X,E,G外,其他各式字符必须用小写。
可以在printf函数中的“格式控制”字符串中包含转义字符。
一个格式说明必须以“%”开头,以9个格式字符之一为结束,中间可以插入附加格式字符。
想输出%,则应该在格式控制字符串中用连续两个%表示。
函数作用:按照变量在内存的地址将变量值存进去。
一般格式:scanf(格式控制,地址表列)
例:用scanf函数输入数据。
#include<stdio.h>
void main()
{
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
printf(“%d,%d,%d\n”,a,b,c);
}
使用scanf函数时应注意的问题 :
(1)scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。
(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。
(3) 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入
(4) 在输入数据时,遇以下情况时认为该数据结束。
① 遇空格,或按“回车”或“跳格”(Tab)键;
② 按指定的宽度结束,如“%3d”,只取3列;
③ 遇非法输入。
一、字符输入输出函数:fputc()和fgetc()
二、字符串输入输出函数:fputs()和fgets()
三、数据块读写函数:fread()和fwrite()
四、格式化读写函数:fprintf()和fscanf()
fprintf ( 文件指针,格式字符串,输出表列);
fscanf ( 文件指针,格式字符串,输入表列);
(有关以上这些函数原型都定义在stdio.h文件中;)
putw()和getw()
函数调用:
putw(int i,FILE * fp);
int i = getw(FILE * fp);
函数功能:
对磁盘文件中读写一个字(整数)。
scanf(格式控制,地址表列) scanf(%...,&…)
printf(格式控制,输出表列) printf("%...",…)
地址表列可以是变量的地址,或字符串的首地址;
输出表列可以是变量,表达式,数值;
printf("%d+%d=%d",a,b,sum);
%d表示十进制整数类型,需要用","后对应位置和类型的变量的值替代的变量;
scanf("%d,%d",&a,&b);
&a代表变量a的地址,输入的数据"3,5"放到a,b中;
字符输入输出函数:getChar(),putChar()
格式输入输出函数:scanf(),printf()
字符串输入输出函数:gets,puts
#include <stdio.h>
int main(void)
{
int a,b,c;
printf("Give me the value of a,b,c seperated with whitespaces:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
puts函数
其一般形式为: puts (字符数组)
其作用是将一个字符串(以′\0′结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为"China"。则执行puts(str);其结果是在终端上输出China。
gets函数
其一般形式为:gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:
gets(str)
从键盘输入:
Computer↙ 将输入的字符串"Computer"送给字符数组str
一个文件通常是磁盘上的一段命名的存储区。
C将文件看成是连续的字节序列;
C程序将输入看作字节流,流的来源可以是文件,输入设备(如键盘),甚至可以是另一个程序的输出。与之类似,C程序将输出也看作是字节流,流的目的地可以是文件,视频显示等;
要仓储文件,要创建一个文件指针,并将其和一个具体的文件关联起来,后续代码就可以使用这个指针而不是文件名来处理文件;
一个文件是由一系列彼此有一定联系的数据集合构成的。
C语言中文件按其储存数据的格式可分为文本文件和二进制文件。
从概念上讲,文本文件中的数据都是以单个字符的形式进行存放的,每个字节存储的是一个字符的ASCII码值,把一批彼此相关的数据以字符的形式存放在一起构成的文件就是文本文件(也叫ASCII码文件)。而二进制文件中的数据是按其在内存中的存储样式原样输出输出到二进制文件中进行存储的,也就是说,数据原本在内存中是什么样子,在二进制文件中还是什么样子。
例如,对于整数12345,在文本文件中存放时,数字12345都是以字符的形式各占一个字节,每个字节中存放的是这些字符的ASCII值,所以要占用5个字节的存储空间。而在二进制文件中占用两个字节。其存放形式如图所示。
在文本文件中的存储形式:
00110001 | 00110010 | 00110011 | 00110100 | 00110101 |
在二进制文件中的存储形式:
00110000 | 00111001 |
综上所述,文本文件和二进制文件的主要区别有以下两点。
1 由于存储数据的格式不同,所以在进行读写操作时,文本文件是以字节为单位进行写入或读出的;而二进制文件则以变量、结构体等数据块为单位进行读写。
2 一般来讲,文本文件用于存储文字信息,一般由可显示字符构成,如说明性文档、C语言的源程序文件等都是文本文件;二进制文件用于存储非文本数据,如某门功课的考试成绩或者图像、声音等信息。
C如何操作文件--文件指针
变量的指针指向变量的存储空间;但文件的指针不是指向一段内在空间,而是指向描述有关该文件相关信息的一个文件信息结构体,该结构体定义在stdio.h头文件中。当然,用户也无需了解有关结构体的细节,只要知道如何使用文件指针就可以了。
由于文件存储在外存储器上,外存的数据读写速度相对较慢,所以在对文件进行读写操作时,系统会在内存中为文件的输入或输出开辟缓冲区。
当对文件进行输出时,系统首先把输出的数据填入为该文件开辟的缓冲区内,每当缓冲区被填满时,就把缓冲区中的内容一次性地输出到对应的文件中。当从某个文件输出数据时,首先将从输入文件中输入一批数据放入该文件的内存缓冲区中,输入语句将从该缓冲区中依次读取数据。当该缓冲区的数据中的数据被读完时,将再从输入文件中输入一批数据放入缓冲区。
在C语言程序中,打开文件就是把程序中要读、写的文件与磁盘上实际的数据文件联系起来,并使文件指针指向该文件,以便进行其他的操作。
FILE *fp
fp = fopen("文件名","打开方式");
(在程序开头头要包含stdio.h文件;)
若文件打开成功,函数会返回一个指向文件的指针值(非0),苦指定的文件不能打开,该函数返回一个空指针值NULL.
文件名可以指定路径,如果省略文件路径,则在当前目录下打开文件。 当前路径在用VC6进会有些差别;使用VC操作时,当前路径在项目路径下,而打开编译后的debug下的exe文件运行时,当前路径来到了debug下;
打开方式:只读、追加、读写、新建、二进制或文本文件
r(read),w(write),a(append),t(text),b(binary),+(读和写);
顺序读写的常用函数
一、字符输入输出函数:fputc()和fgetc()
二、字符串输入输出函数:fputs()和fgets()
fgets()从文本文件中读取一个字符串,并将其保存到内存变量中;
fputs()将一个存放在内存中的字符串写到文本文件中;
三、数据块读写函数:fread()和fwrite()(二进制文件)
四、格式化读写函数:fprintf()和fscanf()
fprintf ( 文件指针,格式字符串,输出表列);
fscanf ( 文件指针,格式字符串,输入表列);
(有关以上这些函数原型都定义在stdio.h文件中;)
文件的随机访问是给定文件当前读写位置的一种读写文件方式,也就是允许对文件进行跳跃式的读写操作。
要定位文件的当前读写位置,C语言使用文件位置指针的概念。
1 取文件位置指针的当前值:ftell(fp)函数,返回当前文件位置指针fp相对于文件开头的位移量,单位是字节。
2 移动文件位置指针:fseek(fp,offset,from)函数,offset可以是负值。from可以取0、1、2三个值,分别代表文件开头、文件当前指针位置、文件末尾。
3 置文件位置指针于文件开头:rewind(fp)函数。
文件的关闭:fclose(fp),当有写操作时,在关闭文件时,系统会首先把文件缓冲区中的剩余数据全部输出到文件中,然后再使指针与文件脱离关系。保持一个文件的打开状态需要占用内存空间,所以以关闭;
文件结束检测:feof(fp),用于测试文件指针fp所指向的文件是否已读到文件尾部。返回1或0;
从用户观点来看,文件分为特殊文件(标准输入输出文件或标准设备文件)和普通文件(磁盘文件);从操作系统的角度看,每一个与主机相连的输入输出设备看作是一个文件。例如,输入文件可以看作终端键盘,输出文件可以看作显示屏和打印机。按数据的组织形式,文件分为ASCII文件(文本文件)和二进制文件。ASCII文件:每一个字节放一个ASCII代码。二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。