C 文件IO
C标准库提供了相关API,帮助我们读、写文件;
文件分类
- 文本文件:人很容易能够读懂的文件,如:代码源文件、txt文件等
- 二进制文件:人不容易读懂的文件,如:可执行程序文件、链接库、图片文件等
文件指针
在c程序中,有三个默认文件指针,它随着程序默认打开与关闭;他们便是:标准输入stdin、标准输出stdout、错误指针stderr;他们三个之外有需要自己初始化的指针,即:使用fopen函数打开文件获取文件指针。
操作一个文件,无论进行读或写,在此之前都需要获取文件指针。文件指针中的“文件”是一个结构体类型

文件操作三部曲:
- 使用fopen打开文件流,打开成功则可以使用函数返回的文件指针进行后续操作
- 无论是读还是写操作,都是操作内存中的一块区域,这块区域需要提前自己申请
- 操作完毕后或操作出错,都要记得关闭文件流
文件打开模式
- w 写入,写之前将文件内容清空;文件不存在则创建
- r 只读方式打开
- w+ 读写方式打开 ,写之前文件内容将被清空;文件不存在则创建
- r+ 读写模式打开
- a 追加写方式打开,文件不存在则创建
- a+ 追加读写方式打开,文件不存在则创建
读写文本文件
下面演示写入字符串到文本文件然后再从文本文件中读取它
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
FILE* f_write_ptr = fopen("test.txt", "a+");
if (f_write_ptr == NULL)
{
perror("打开文件");
exit(-1);
}
fputs("输入要保存到文件中的信息:\n", stdout);
char input_buffer[100];
memset(input_buffer, 0, sizeof(input_buffer));
char* input_str = fgets(input_buffer, sizeof(input_buffer) - 1, stdin);
if (input_str != NULL)
{
size_t write_ret = fputs(input_str, f_write_ptr);
}
fclose(f_write_ptr);
FILE* f_read_ptr = fopen("test.txt", "r");
if (f_read_ptr == NULL)
{
perror("打开文件");
exit(-1);
}
char buffer[10] = { 0 };
char* read_str = fgets(buffer, sizeof(buffer) - 1, f_read_ptr);
if (read_str == NULL)
{
perror("读取内容");
exit(-1);
}
fputs(read_str, stdout);
fclose(f_read_ptr);
return 0;
}
小知识:
- 读写文本文件使用 fputs和fgets函数
- 对于fgets,它的功能是读取文件中指定长度的字符串;读取成功返回传入的字符数组的首地址,读取失败或者读到文件末尾会返回NULL;
- gets 遇到换行符或文件末尾函数会直接结束;故此函数最多只能读取一行;
- fegets函数,会在读取到的一串字符末尾追加"\n";故用于接收字符串的字符数组,需要预留一位;
- 对于fputs,它的功能是向指定文件中写入字符串;写入成功返回非负值。
- 如何将字符数组,所有元素置0;两种方法,第一种:初始化时使用{0}或使用memset函数
所以上面的代码 有冗余
1、 fgets读取成功,返回值是传入的字符数组的首地址;所以无需再维护一个字符指针。
2、 由于fgets函数会自动追加\0字符;即操作完成字符数组就是合法字符串,所以无需每次都将字符数组全置为0。
读取文本文件所有内容
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
FILE* fptr = fopen("test.txt", "r");
if (fptr == NULL)
{
perror("打开文件");
exit(-1);
}
char buffer[6] = { 0 };
while (fgets(buffer, sizeof(buffer) - 1, fptr) != NULL)//每次读取一定长度,直到读取到文件末尾返回NULL
{
printf("%s\n", buffer);
}
fclose(fptr);
return 0;
}
读写二进制文件
下面演示将一个整型数写入到二进制文件中然后再读取它
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *f_write_ptr = fopen("test", "wb");//wb:w代表写入 b代表二进制
if (f_write_ptr == NULL) {//判断文件是否正常打开
perror("opening file");
exit(-1);
}
//将一个整型数写入文件
int num = 12;
size_t ret_write = fwrite(&num, sizeof(int), 1, f_write_ptr);
if (ret_write != 1) {
perror("Error writing to file");
}
if (fclose(f_write_ptr) != 0) {//关闭文件流 若正常关闭函数返回0
perror("close file");
exit(-1);
}
//从二进制文件中读取这个整型数
FILE *f_read_ptr = fopen("test", "rb");//rb:r代表读取 b代表二进制
if (f_read_ptr == NULL) {
perror("opening file");
exit(-1);
}
int num_read;
size_t ret_read = fread(&num_read, sizeof(int), 1, f_read_ptr);
if (fclose(f_read_ptr) != 0) {
perror("close file");
}
printf("read number %d\n", num_read);
return 0;
}
文件IO操作知识点,记录完毕。

浙公网安备 33010602011771号