文件系统
文件是指存储在外部存储介质的数据集合(如磁盘光盘等)。操作系统中使用由文件路径和文件名两部分组成的文件标识符来标识文件。
而在C、C++语言中无论是何种文件,都将其看做是一段字节序列。在对其进行读写操作时,以字节流(stream)的方式进行处理。以字节流的方式进行文件操作,很方便的将具体的文件格式都归一为相同流式操作,增强了处理文件的灵活性。
文件缓冲区
因为文件存储在外存介质中,对于CPU而言,访问内存的效率要比访问访问内存的效率更加快。为提高计算机的运行效率,操作系统会分配一块称为文件缓冲区的内存区域,对文件的读写操作会首先在对文件缓冲区进行操作,再在适当的时机,将缓冲区的数据一次写入到外存中。
使用scanf操作时需要注意缓冲区
虽然有文件缓冲区的存在,但在一般的读写文件时并不需要十分理会对于最后缓冲区写入外存的时机。但在使用scanf函数时,需要注意缓冲区问题。
下面的一个例子,我们期望依次输入hello中的每个字符后,将输入的字符串数组打印出来。
char c[6] = { '\0' , '\0' , '\0' , '\0' , '\0', '\0' };
int i = 0;
printf("输入(hello) :\n");
for (size_t i = 0; i < 5; i++)
{
scanf("%c", &c[i]);
}
printf("输入的内容:%s \n", c);
但当依次输入h ,回车,e,回车,l,回车时,程序便直接执行最后一个printf函数。而且得到的也并不是我们期望的hello。
输入(hello)
h
e
l
输出的内容;h
e
l
出现这种结果的原因是scanf的实际作用是取标准输入缓冲区中最前的字符,而且换行符也是输入也包含了一个字符,所以在得到的字符串数组具体的值为{ ‘h’,0x0A, ‘e’,0x0A,’l’,0x0A,’\0’} (0x0A为换行符)
同样的代码,直接输入hello + 回车时可以达到目的
输入(hello)
hello
输出内容: hello
同理,这次因为没有换行符的影响,从标准输入缓冲区得到的是我们需要的hello
读写文件操作
文件结构体FILE
在使用fopen函数打开文件时,返回一个FILE * 指针,这个FILE结构体称为文件结构,这个结构体存放了一些和本文件中有关的一些信息。但对于不同的操作系统而言,该结构体会有所区别,所以在使用该函数进行跨平台开发时,就需要在理会其中的具体成员。
//打开文件
FILE * fp = fopen("I:\\xx.txt", "r");
在windows平台下,通过查看visual studio 安装目录下VC\include\stdio.h可以看到其具体的结构