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