商务网站建设中的必备功能上海推广网站
商务网站建设中的必备功能,上海推广网站,眉山市住房和城乡建设局网站,我做的网站搜不到本章重点
1. 为什么使用文件 2. 什么是文件 3. 文件的打开和关闭 4. 文件的顺序读写 5. 文件的随机读写 6. 文本文件和二进制文件 7. 文件读取结束的判定 8. 文件缓冲区 1. 为什么使用文件
我们在前面的文章介绍了通讯录的程序#xff0c;当通讯录运行起来的时候#xff0c…本章重点
1. 为什么使用文件 2. 什么是文件 3. 文件的打开和关闭 4. 文件的顺序读写 5. 文件的随机读写 6. 文本文件和二进制文件 7. 文件读取结束的判定 8. 文件缓冲区 1. 为什么使用文件
我们在前面的文章介绍了通讯录的程序当通讯录运行起来的时候可以给通讯录中增加、删除数据此时数据是存放在内存中当程序退出的时候通讯录中的数据自然就不存在了等下次运行通讯录程序的时候数据又得重新录入如果使用这样的通讯录就很难受。 我们在想既然是通讯录就应该把信息记录下来只有我们自己选择删除数据的时候数据才不复存在。 这就涉及到了数据持久化的问题我们一般数据持久化的方法有把数据存放在磁盘文件、存放到数据库等方式。 使用文件我们可以将数据直接存放在电脑的硬盘上做到了数据的持久化。
2. 什么是文件
我们一般谈的文件有两种程序文件、数据文件从文件功能的角度来分类的
1 程序文件
程序文件是指计算机程序的代码文件其中包含了一些指令和数据用于在计算机上执行特定的任务。这些文件可以在不同的编程语言中编写如C、Java、Python等。包括源程序文件后缀为.c,目标文件windows环境后缀为.obj,可执行程序windows环境后缀为.exe。
2 数据文件
数据文件是计算机存储数据的文件这些文件通常包含结构化数据或非结构化数据。数据文件可以存储在计算机的本地磁盘上或者存储在网络上的文件服务器或云存储中。
3.文件名
一个文件要有一个唯一的文件标识以便用户识别和引用。 文件名包含3部分文件路径文件名主干文件后缀 例如 c:\code\test.txt 为了方便起见文件标识常被称为文件名。
3. 文件的打开和关闭
1 文件指针
文件指针File pointer是程序中用于访问文件的一种数据类型。它保存了文件的位置信息包括文件的当前位置、文件的开头位置、文件的结尾位置等。
文件指针通常是一个指向 FILE 结构的指针通过文件指针可以实现对文件的读、写和定位操作。
每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息如文件的 字文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是有系声明的取名FILE。
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;FILE* pf;//文件指针变量定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区是一个结构体变量。通过该文件信息区中的信息就能够访问该文件。也就是说通过文件指针变量能够找到与它关联的文件。 2 文件的打开和关闭
文件在读写之前应该先打开文件在使用结束后应该关闭文件
在编写程序的时候在打开文件的同时都会返回一个FILE*的指针变量指向该文件也相当于建立了指针和文件的关系。 ANSIC 规定使用fopen函数来打开文件fclose来关闭文件。
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );文件的打开方式是多种多样的下面是各种打开方式根据需求在*mode处进行修改即可。
文件使用方式 含义 如果指定文件不存在
“r”只读 为了输入数据打开一个已经存在的文本文件 出错
“w”只写 为了输出数据打开一个文本文件 建立一个新的文件
“a”追加 向文本文件尾添加数据 建立一个新的文件
“rb”只读 为了输入数据打开一个二进制文件 出错
“wb”只写 为了输出数据打开一个二进制文件 建立一个新的文件
“ab”追加 向一个二进制文件尾添加数据 出错
“r”读写 为了读和写打开一个文本文件 出错
“w”读写 为了读和写建议一个新的文件 建立一个新的文件
“a”读写 打开一个文件在文件尾进行读写 建立一个新的文件
“rb”读写 为了读和写打开一个二进制文件 出错
“wb”读写 为了读和写新建一个新的二进制文件 建立一个新的文件
“ab”读写 打开一个二进制文件在文件尾进行读和写 建立一个新的文件
下面是一段示例
/* fopen fclose example */
#include stdio.h
int main ()
{
FILE * pFile;
//打开文件
pFile fopen (myfile.txt,w);
//文件操作
if (pFile!NULL)
{
fputs (fopen example,pFile);
//关闭文件
fclose (pFile);
}
return 0;
}
代码运行后在源文件的目录下会创建一个名字为myfile的文本文件而fputs函数将“fopen example”字符串输出到文件中在关闭文件后该文本文件会显示该字符串这样我们便完成了关于文件的读写。文件的读写也分两种形式分别是顺序读写和随机读写下面我们来一一介绍。 4. 文件的顺序读写
文件的顺序读写可以分为两种方式顺序读取和顺序写入。
顺序读取从文件开头开始依次读取每个字节或块直到读取到文件的末尾。这种读取方式适用于文件的内容是按照特定顺序排列的情况比如文本文件和数据文件。
顺序写入从文件开头开始依次写入每个字节或块直到写入完所有数据或者达到文件的最大容量。这种写入方式适用于需要按照一定顺序写入数据的情况比如生成二进制文件和写入网络数据流。
在实际应用中顺序读写文件的方式可以提高文件读写的效率同时也可以避免因为读写位置的频繁跳跃而带来的额外开销和不必要的操作。
下面是关于顺序读写的函数老铁们自行去实验一下哦。
功能函数名适用于字符输入函数fgetc所有输入流字符输出函数fputc所有输出流文本行输入函数fgets所有输入流文本行输出函数fputs所有输出流格式化输入函数fscanf所有输入流格式化输出函数fprintf所有输出流二进制输入fread文件二进制输出fwrite文件
5. 文件的随机读写
文件的随机读写指的是可以在文件中任意位置读取或写入数据。相比于顺序读写随机读写可以提高读写效率特别是对于大文件来说更加方便和灵活。
文件的随机读写需要先使用文件指针来指定读写位置可以使用fseek()函数来移动文件指针。该函数有三个参数第一个参数是文件指针第二个参数是偏移量第三个参数是偏移的起始位置可以为SEEK_SET、SEEK_CUR或SEEK_END。
1 fseek
根据文件指针的位置和偏移量来定位文件指针。
int fseek ( FILE * stream, long int offset, int origin );
示例代码
/* rewind example */
#include stdio.h
int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile fopen (myfile.txt,w);
for ( nA ; nZ ; n)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]\0;
puts (buffer);
return 0;
}
2 ftell
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream ); 示例
/* ftell example : getting size of a file */
#include stdio.h
int main ()
{
FILE * pFile;
long size;
pFile fopen (myfile.txt,rb);
if (pFileNULL) perror (Error opening file);
else
{
fseek (pFile, 0, SEEK_END); // non-portable
sizeftell (pFile);
fclose (pFile);
printf (Size of myfile.txt: %ld bytes.\n,size);
}
return 0;
}
3 rewind
让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );
示例代码
/* rewind example */
#include stdio.h
int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile fopen (myfile.txt,w);
for ( nA ; nZ ; n)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]\0;
puts (buffer);
return 0;
} 6. 文本文件和二进制文件
根据数据的组织形式数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储如果不加转换的输出到外存就是二进制文件。 如果要求在外存上以ASCII码的形式存储则需要在存储前转换。以ASCII字符的形式存储的文件就是文 本文件。 一个数据在内存中是怎么存储的呢 字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储也可以使用二进制形式存储。 如有整数10000如果以ASCII码的形式输出到磁盘则磁盘中占用5个字节每个字符一个字节而 二进制形式输出则在磁盘上只占4个字节VS2013测试 7. 文件读取结束的判定
1 被错误使用的feof
feof函数需要输入一个文件指针 stream它会在指针所指向的文件达到结尾时返回非零值即 true否则返回 0 值即 false。
通常我们可以在循环读取文件时使用 feof() 函数来检查文件是否已到达结尾。具体地说我们可以在每次循环之前调用 fgets() 函数读取一行并使用 feof() 函数检查文件指针是否已到达结尾。如果到达结尾则跳出循环否则继续读取文件。
但很多人将它的返回值看着是衡量文件读取是否结束的标志这是错误的因为文件也会在读取过程中出现错误这得分情况进行考虑。
牢记在文件读取过程中不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候判断是读取失败结束还是遇到文件尾结束
1. 文本文件读取是否结束判断返回值是否为 EOF fgetc 或者 NULL fgets 例如 fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL . 2. 二进制文件的读取结束判断判断返回值是否小于实际要读的个数。 例如 fread判断返回值是否小于实际要读的个数
正确的使用 #include stdio.h
#include stdlib.h
int main(void)
{
int c; // 注意int非char要求处理EOF
FILE* fp fopen(test.txt, r);
if(!fp) {
perror(File opening failed);
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候都会返回EOF
while ((c fgetc(fp)) ! EOF) // 标准C I/O读取文件循环
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts(I/O error when reading);
else if (feof(fp))
puts(End of file reached successfully);
fclose(fp);如果是二进制文件的话
#include stdio.h
enum { SIZE 5 };
int main(void)
{
double a[SIZE] {1.,2.,3.,4.,5.};
FILE *fp fopen(test.bin, wb); // 必须用二进制模式
fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
fclose(fp);
double b[SIZE];
fp fopen(test.bin,rb);
size_t ret_code fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
if(ret_code SIZE) {
puts(Array read successfully, contents: );
for(int n 0; n SIZE; n) printf(%f , b[n]);
putchar(\n);
} else { // error handling
if (feof(fp))
printf(Error reading test.bin: unexpected end of file\n);
else if (ferror(fp)) {
perror(Error reading test.bin);
}
}
fclose(fp);
}
8. 文件缓冲区
我们先来介绍一下ANSIC这个标准
ANSIC 是 C 语言的一种标准化版本是由 ANSIAmerican National Standards Institute美国国家标准化协会制定的。其全称是 American National Standard for Information Systems — Programming Language — CANSI C或简称 C89。这个标准于 1989 年发布主要为了解决 C 语言在不同编译器和计算机上的兼容性问题。
ANSIC 定义了 C 语言的语法、数据类型、函数库等同时还规定了 C 语言编译器和标准库的行为。ANSIC 的发布对于 C 语言的发展有着深远的影响使得 C 语言成为了一种可以跨平台使用的编程语言并且促进了 C 语言在工业界和学术界的广泛应用。
ANSIC 目前已经被多种编程语言所采纳包括 C、Java、Python 等。同时ANSIC 的标准也在不断地更新和修订例如 C99 和 C11 等。
ANSIC 标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根据C编译系统决定的。 #include stdio.h
#include windows.h
//VS2013 WIN10环境测试
int main()
{
FILE*pf fopen(test.txt, w);
fputs(abcdef, pf);//先将代码放在输出缓冲区
printf(睡眠10秒-已经写数据了打开test.txt文件发现文件没有内容\n);
Sleep(10000);
printf(刷新缓冲区\n);
fflush(pf);//刷新缓冲区时才将输出缓冲区的数据写到文件磁盘
//注fflush 在高版本的VS上不能使用了
printf(再睡眠10秒-此时再次打开test.txt文件文件有内容了\n);
Sleep(10000);
fclose(pf);
//注fclose在关闭文件的时候也会刷新缓冲区
pf NULL;
return 0;
}
这里可以得出一个结论 因为有缓冲区的存在C语言在操作文件的时候需要做刷新缓冲区或者在文件操作结束的时候关闭文件如果不做可能导致读写文件的问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89042.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!