C语言文件操作

C语言文件操作

参考文章:【C/C++语言入门篇】– 文件操作
函数参考网站:C语言中文网

闲话

昨天那个操作系统实验课上因为文件流操作的失误和不理解,导致整节课都在调试还找不到方向…于是回来之后怒研究一波 C 的文件操作。

理解文件操作

C 的文件操作是以字节流或者二进制流来操作的。通过 C 的函数将数据送入内存缓冲区,然后从缓冲区把数据读入磁盘的文件或者程序。

所以我们用 fopen 来读取文件的时候相当于开辟了一个流来对文件进行读写。那么如何操纵文件呢? C 的文件是用 FILE 结构体来描述的,于是我们要对文件进行操作,当然要用一个 FILE 指针, fopen 的返回值就是指向这个文件的 FILE 指针。

fopen

FILE fopen(const char path, const char * mode);

第一个参数是文件的位置,第二个参数是文件打开方式,有只读 r,读写 r+ 等等。具体内容可以参考这里。返回值就是 FILE 指针了,后面很多函数都会用到这个变量。

因为二进制底层的天然优势,读写二进制文件的速度是快于读写字节文件的速度的。

fseek

int fseek(FILE * stream, long offset, int whence);

第一个参数是文件指针,第二个参数是偏移量(实际上是空间大小),是相对于第三个参数来说的。而第三个参数则是读写位置,它可以是:

  • SEEK_SET 从文件头开始
  • SEEK_END 从文件尾开始

其中这个文件头是绝对的,但是文件尾是相对的,会随着文件内容的改变而发生一些变化。昨天我就是因为很傻逼地把不应该被随便修改的数据写在了文件尾而导致运行结果一直有问题…

fread

size_t fread(void buffer, size_t size, size_t count, FILE stream);

buffer 为接收数据的地址(一般是一个变量)
size 为一个单元的大小
count 为单元的个数
stream 为文件流指针

fflush

int fflush(FILE* stream);

fflush 可以用来清空文件缓冲区或标准输入输出缓冲区 stdin/stdout。

如果是要写的文件就把缓冲区的内容写入文件。最开始有提到,函数将数据写入缓冲区,而默认情况下只有缓冲区满了才会将缓冲区的数据写入文件中,这里就加速了这一个过程。可以防止因为断电损坏等原因而使得缓冲区的内容没有及时写入文件。

fwrite

size_t fwrite(void buffer, size_t size, size_t count, FILE stream);

参数和 fread 的相同,一般写入之后都会 fflush 一下,确保数据写入了文件。

fclose

int fclose(FILE * stream);

不要忘了关闭文件流。