网站建设推广咨询平台,织梦网站主页代码在后台怎么改,可以做淘宝联盟的免费网站,可以使页面具有动态效果的网站建设技术1. 铺垫
建议先看#xff1a;
文件操作#xff08;基础知识篇#xff09;-CSDN博客
文件操作#xff08;顺序读写篇#xff09;-CSDN博客
首先要指出的是#xff0c;本篇文章中的“文件指针”并不是指FILE*类型的指针#xff0c;而是类似于打字时的光标的东西。
打…1. 铺垫
建议先看
文件操作基础知识篇-CSDN博客
文件操作顺序读写篇-CSDN博客
首先要指出的是本篇文章中的“文件指针”并不是指FILE*类型的指针而是类似于打字时的光标的东西。
打开文件时候文件指针会指向文件开头。
刚打开文本文件时文件指针自动指向文件起始处之后会随读写内容移动。
读数据时从文件指针位置向后读取读取成功后文件指针指向被读取数据的末尾写数据时从文件指针位置向后写写入成功后文件指针指向被写入数据的的末尾。
当我们想要在某指定位置处读取数据或着在某指定位置处写入数据时就需要用到接下来所要介绍的函数也就是进行文件的随机读写。
2. fseek函数 该函数可以设置文件指针的位置。
通过三个标准位置以及相对于标准位置的偏移量来指定文件指针的位置。
第二个参数表示相对于标准位置的偏移量正数表示向后偏移负数表示向前偏移。
第三个参数表示标准位置其可取的值有三个
SEEK_SET文件开头SEEK_CUR文件指针当前位置SEEK_END文件末尾
成功设置文件指针的位置时返回0失败时发生错误返回非零的值。
使用示例
#include stdio.hint main ()
{FILE * pFile;pFile fopen ( example.txt , wb );fputs ( This is an apple. , pFile );fseek ( pFile , 9 , SEEK_SET );fputs ( sam , pFile );fclose ( pFile );return 0;
}3. ftell 该函数可以获取当前文件指针相对于起始位置的偏移量。
获取成功时返回文件指针相对于起始位置的偏移量获取失败时返回-1L。
使用示例
#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-portablesizeftell (pFile);fclose (pFile);printf (Size of myfile.txt: %ld bytes.\n,size);}return 0;
}
4. rewind 该函数可以使文件指针回到文件起始位置。
使用示例
#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;printf(buffer);return 0;
}
5. 文件读取结束的判定
被错误使用的feof函数
牢记在文件读取过程中不能用feof函数的返回值直接来判断文件的是否结束。
feof 的作用是当文件读取结束的时候判断是读取结束的原因是否是“遇到文件尾结束”。
1. 文本文件读取是否结束判断返回值是否为 EOF fgetc 或者 NULL fgets
例如 • fgetc 判断是否为 EOF。 • fgets 判断返回值是否为 NULL。 #include stdio.h
#include stdlib.h
int main(void)
{int c; // 注意int⾮char要求处理EOFFILE* fp fopen(test.txt, r);if(!fp) {perror(File opening failed);return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候都会返回EOFwhile ((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);return 0;
} 2. 二进制文件的读取结束判断判断返回值是否小于实际要读的个数。
例如 • fread判断返回值是否小于实际要读的个数。 #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 handlingif (feof(fp))printf(Error reading test.bin: unexpected end of file\n);else if (ferror(fp)) {perror(Error reading test.bin);}}fclose(fp);return 0;
}
6. 文件缓冲区
ANSIC 标准采用“缓冲文件系统” 处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟⼀块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。
缓冲区的大小是根据C编译系统决定的。
缓冲区的存在是为了避免程序频繁地向操作系统发出申请从而影响其他进程。 #include stdio.h
#include windows.h
//VS2019 WIN11环境测试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语言在操作文件的时候需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做可能导致读写文件的问题。