前言

此篇文章記錄 C 語言藝術的第 11 章節<資料結構與檔案處理>,大致統整一些 C 語言中檔案處理的寫法,也整理筆者對於當前程式題目常見的程式寫法。

資料結構

Struct

**struct,**是資料結構中最為重要的一項觀念,其作用就像你的學生證,struct 的名稱是【學生證】,新辦一張卡,使這個資料結構創建一個為【client】,內容物為你的【姓名】、【年齡】、【id】、【金額】,和一般創建變數的方式相同,只是內容物需要自己指定。

語法

#include <stdio.h>

// struct 基本寫法
struct Student_id_card{
	unsigned int id;
	unsigned int age;
	char name[15];
	double balance = 0.0; // 可以預先設定 struct 裡變數的初始值
};

int main(){
	// 第一種創建方式,一個一個指定,或由輸入決定
	struct Student_id_card client;
	scanf("%f", &client.balance);
	client.age = 16;
	
	// 第二種創建方式,一次性的指定
	struct Student_id_card John = {12345, 18, "JoHn", 100.0};
	
	// 所有可以對變數的動作,if、for、scanf、printf......,都可以對 struct 動作
	printf("%s %d %d %f", John.name, John.age, John.id, John.balance);
}

懂了嗎?嘗試看看這個題目吧~!

3/22 第一題 會員消費紀錄

循序讀取檔案

檔案處理中最為基礎的東西,假設滑鼠游標稱為【read_dart】,檔案開啟時,read_dart 會置於檔案的開頭位置,接著循序向下讀取資料,直到檔案的結尾。

輸入與輸出

讀取資料是檔案結構中最為重要的一部份,可以說不會資料的輸入與輸出就是不會檔案處理。

基本格式

#include <stdio.h>

int main(){
	// 創建指標指向要開啟的檔案
	FILE *input, *output;
	input = fopen("input.txt", "r");
	output = fopen("output.txt", "w");
	
	// 字元陣列與字元
	char str[10000];
	char ch;
	
	// 檔案開啟的除錯
	if(input == NULL){
		printf("input.txt open read mode failed.\\n");
	}
	if(output == NULL){
		printf("output.txt open write mode failed.\\n");
	}
	
	// 輸入
	fscanf(input, "%s", str); // 與 scanf 相同,遇到空格自動停下
	fgets(str, 10000, input); // 與 getline(cin, input) 相同,讀入一整行包含空白
	ch = fgetc(input); // 與 getchar 相同,單取一個字元變數
	
	// 輸出
	fprintf(output, "%s %c\\n", str, ch); // 與 printf 一樣,可以排版
	fputc(ch, output) // 單純輸出一個字元
	
	// 將讀取的位置重置到檔案開頭位置
	rewind(input);
	
	// 關檔
	fclose(input);
	fclose(output);
}

常見迴圈結構

while(fscanf(input, "%s", str) != EOF){}

while(fgets(str, 10000, input) != NULL){}

while(fgetc(input)){}

處理由檔案輸入的字元陣列

字串轉數字(atoi)、數字轉字串(itoa、sprintf)