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操作知識點,記錄完畢。