C 文件IO

C标准库提供了相关API,帮助我们读、写文件;

文件分类

  • 文本文件:人很容易能够读懂的文件,如:代码源文件、txt文件等
  • 二进制文件:人不容易读懂的文件,如:可执行程序文件、链接库、图片文件等

文件指针

在c程序中,有三个默认文件指针,它随着程序默认打开与关闭;他们便是:标准输入stdin、标准输出stdout、错误指针stderr;他们三个之外有需要自己初始化的指针,即:使用fopen函数打开文件获取文件指针。
操作一个文件,无论进行读或写,在此之前都需要获取文件指针。文件指针中的“文件”是一个结构体类型
image

文件操作三部曲:

  • 使用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操作知识点,记录完毕。

posted @ 2025-11-19 21:37  BigBosscyb  阅读(7)  评论(0)    收藏  举报