Unix/Linix系統程式設計第九章學習筆記
阿新 • • 發佈:2021-09-19
Unix/Linix系統程式設計第九章學習筆記
作者:20191322wyl
知識點總結
I/O庫函式與系統呼叫
-
系統呼叫函式:open()、read()、write()、lseek()、close()
-
I/O庫函式:fopen()、fread()、fwrite()、fseek()、fclose()
fopen()函式使用字串表示模式,"r"表示"read"(可讀)、“w”表示"write"表示“write”(可寫);
如果有任何fopen()呼叫失敗,程式就會終止
I/O庫函式的演算法
fread演算法
- fread()一方面接受來自使用者程式的呼叫,另一方面向作業系統核心發出read()系統呼叫
- 除了read()系統呼叫外,所有fread()處理都在使用者模式映象中執行
fwite演算法
- 與fread()算啊相似,只是資料傳輸方向不同
fclose演算法
關閉檔案
I/O庫模式
檔案結束符通常是返回一個整數-1
格式化I/O
輸入:
scanf(char *FMT,&items)//從stdin中讀取
fscanf(fp,char*FMT,&items)//從流中讀取
檔案流緩衝
- 無緩衝:從非緩衝流中寫入或讀取的字元將盡快單獨傳輸到檔案或從檔案中傳輸
- 行緩衝:遇到換行符時,寫入行緩衝流的字元以塊的形式傳輸
- 全緩衝:寫入全緩衝流或從中讀取的字元以塊大小傳輸到檔案或從檔案傳輸
二進位制檔案和文字檔案如何轉換?
解決方案:
因為可顯示字元有256個,即需要8位二進位制才能表示出來,所以文字檔案轉換為二進位制檔案就相當於把AscII碼字元(10進位制)轉換成八位2進位制,即核心就是10進位制轉換成2進位制的演算法,同理,二進位制檔案轉換為文字檔案的核心就是2進位制轉換成10進位制。
具體程式碼看實踐
實踐內容
- 設計一個程式,該程式讀取文字檔案(包含 ASCII字元的檔案),並使用0和1將所有字元編碼為二進位制字元
- 設計一個程式,它將讀取二進位制檔案,並將二進位制檔案的內容轉換為 ASCII 字元序列
程式碼:
#include <stdio.h> #include <string.h> #define NSIZE 8 void text2bin(const char* sIn, const char* sOut)// text to bin { int count = 0; int ch,a; char temp; FILE * fin = fopen(sIn, "r"); FILE * fout = fopen(sOut, "w"); while(fscanf(fin, "%c", &temp)!=EOF) { ch=temp; for (a = 7; a >= 0; a--) fprintf(fout, "%d", ch >> a & 1); } fclose(fin); fclose(fout); } void bin2text(const char* sIn, const char* sOut)//bin to text { FILE * fin = fopen(sIn, "r"); FILE * fout = fopen(sOut, "w"); int i = 0, j = 0, iTemp = 0, flag = 0; int ibina[NSIZE]; char cRead[NSIZE]; char str[8]; char cChar; int a=0; while(fscanf(fin, "%c", &str[a%8])!=EOF) { if(a%8==7) { iTemp = 1; cChar = 0; for (j = 7; j >= 0; j--) { cChar += (str[j]-'0') * iTemp; iTemp *= 2; } fprintf(fout, "%c", cChar); } a++; } fclose(fin); fclose(fout); } int main() { bin2text("bin.txt","bin2textresult.txt"); text2bin("text.txt","text2binresult.txt"); }
執行結果:
-
首先找到自己學號姓名的文字和二進位制
-
然後在虛擬機器建立bin.txt檔案和text.txt檔案,用來存放文字和二進位制值
-
建立檔案bin2textresult.txt和檔案text2binresult.txt,用來儲存執行結果
-
執行程式碼
-
檢視執行結果
-
比較,結果正確,程式碼無誤。