C語言基礎及指標⑧檔案IO
接續上篇C語言基礎及指標⑦結構體與指標
在結構體與指標中 , 我們瞭解到結構體與java中的類相似 , 也是一種自定義型別資料結構 , 也學習了結構的各種用法 , 以及簡單的應用 。
在編寫應用程式的時候 , 檔案IO操作是不可避免的 , 小到日誌本地化收集 , 大到資料格式化儲存 , 都需要使用檔案IO , 來操作檔案流進行資料處理 。在使用java開發的時候 , 我們有File
類和FileReader
,FileWriter
類來搭配使用 , 也有FileInputStream
,FileOutputStream
和BufferedInputStream
,BufferedOutputStream
金牌組合 。使得java中的檔案IO很方便 , 下面我們就來看看簡單的java檔案IO示例:
// 讀取檔案中的字元
private static void readString() throws Exception{
File _file = new File("e:"+separetor+"a.txt") ;
if (!_file.exists()) {
boolean createStatuts = _file.createNewFile() ;
if (createStatuts) {
System.out.println("建立了一個新檔案 ,並且建立成功了");
}else {
System.out.println("建立新檔案失敗");
}
}
// 建立輸入流
InputStream fileInputStream = new FileInputStream(_file) ;
byte[] bytes = new byte[1024] ;
int len = -1;
StringBuffer buffer = new StringBuffer() ;
while ((len = fileInputStream.read(bytes)) != -1) {
buffer.append(new String(bytes,0,len)) ;
}
// 關閉輸入流
fileInputStream.close() ;
System.out.println(buffer.toString());
}
// 將字串寫入檔案
private static void writeString() throws Exception{
File _file = new File("e:"+separetor+"a.txt") ;
if (!_file.exists()) {
boolean createStatuts = _file.createNewFile() ;
if (createStatuts) {
System.out.println("建立了一個新檔案 ,並且建立成功了");
}else {
System.out.println("建立新檔案失敗");
}
}
// 建立輸出流
OutputStream fileOutputStream = new FileOutputStream(_file) ;
String info = "《op 青空 pure rouge 君吻》《君吻 その目に映るもの piano》" ;
fileOutputStream.write(info.getBytes()) ;
// 關閉輸出流
fileOutputStream.close() ;
}
檔案IO操作步驟:
1.建立一個File物件(需要操作的檔案)
2.構建輸入輸出流
3.建立緩衝區 , 快取讀寫資料 (將流資料讀入到記憶體或寫入到磁碟)
3.關閉流 (關閉檔案流)
語言都是相通的 , 在C語言中檔案IO的操作也是如上述幾步 , 下面我們就一起來看看:
/*讀取文字檔案*/
void readTextFile() {
char* path = "C:\\Users\\Zeno\\Documents\\Visual Studio 2015\\Projects\\Hello_C\\Hello_C\\StructPointer.c";
// 開啟檔案
FILE* fp = fopen(path, "r");
if (fp == NULL)
{
printf("開啟檔案失敗\n");
return;
}
// 字元緩衝區 , 每次讀一個字串 , 都會快取到字元陣列中
char buffer[1024];
while (fgets(buffer, 1024, fp)) {
printf("%s", buffer);
}
// 關閉檔案流
fclose(fp);
/*寫入文字檔案*/
void writeTextFile() {
char* path = "E:\\document\\write.txt";
char* content = "如果 愛情是一場花火 ,一閃即逝的花火,我也要去追求\n如果 愛情是一場花火 ,一閃即逝的花火,我也要去追求\n";
// 開啟檔案
/*
開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
*/
FILE* fp = fopen(path, "w");
if (fp == NULL)
{
printf("開啟檔案失敗\n");
return;
}
// 寫入檔案
fputs(content, fp);
// 關閉檔案流
fclose(fp);
}
}
首先使用fopen
函式得到一個檔案指標 , 操作符r
為讀取檔案流 , 構建了一個buffer
資料緩衝區 , 通過fgets
函式迴圈讀取檔案資料 , fclose
函式關閉檔案流 。在操作檔案IO的時候 , 最重要的函式 , 莫過於fopen
函式了 , 首先我們來看一下fopen
函式的定義:
_ACRTIMP FILE* __cdecl fopen(
_In_z_ char const* _FileName,
_In_z_ char const* _Mode
);
我們發現fopen
函式 , 需要傳入檔案全路徑名稱 , 還有一個_Mode
, 這個是檔案操作模式 , C語言中檔案操作主要依靠操作模式來辨別是輸入流還是輸出流的 。
下面列舉一些常用的操作模式:
mode有下列幾種形態字串:
r 開啟只讀檔案,該檔案必須存在。
r+ 開啟可讀寫的檔案,該檔案必須存在。
w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。
值得注意的是 , 上述操作模式是針對文字檔案的 , 如果要操作二進位制檔案 , 則需要在上述操作符後面加上b
, 如rb
,wb
,ab
, 等等 。
不論是文字檔案的操作還是字元檔案的操作 , 都是 , 開啟檔案 , 建立緩衝區 , 讀寫檔案 。
二進位制檔案讀寫
/*讀寫二進位制檔案 -- 複製檔案*/
void fileCopy() {
char* currentPath = "E:\\android_pdf\\研磨設計模式.pdf";
char* destPath = "E:\\android_pdf\\研磨設計模式_new.pdf";
// 開啟檔案
FILE* currentFile_P = fopen(currentPath, "rb");
FILE* destFile_P = fopen(destPath, "wb");
// 先讀取再寫入
int buffer[1024]; // 資料緩衝區
int len; // 每次讀取資料的長度
while ((len = fread(buffer,sizeof(int),1024,currentFile_P)) != EOF)
{
// 將緩衝區裡的內容寫入到檔案中
fwrite(buffer, sizeof(int), len, destFile_P);
}
// 關閉流
fclose(destFile_P);
fclose(currentFile_P);
}
讀寫二進位制和讀寫文字檔案沒多少區別 , 最大的區別就是fopen
函式中的模式的不同 , 文字檔案是r
,w
, 二進位制檔案是rb
,wb
。
瞭解了檔案IO的基本操作 , 我們使用檔案IO流寫一個加密解密的小程式。我們知道 , 所有的檔案都是以二進位制儲存的 , 我們看的文字檔案, 圖片檔案 , 視訊檔案 , 都是以二進位制儲存在磁碟上的 , 那麼 , 我們可以將檔案讀取出來 , 進行二進位制運算 , 就可以將檔案加密解密了 。下面我們通過^
異或運算來進行檔案的加密解密 , 異或運算的規則如下:
0 ^ 1 得 1
1 ^ 1 得 0
0 ^ 0 得 0
1 ^ 0 得 1
相同為0 不同為1 , 例如 , 我們將4
這個數加密 , 異或的數是5 , 下面我們來看看運算:
4的二進位制是:0100
5的二進位制是:0101
異或運算結果(加密):4 ^ 5 == 0001
異或運算結果(解密): 0001 ^ 0101 == 0100
由上述可見 , ^一次為加密 , 再^一次就是解密
程式碼示例如下:
檔案加密
/*加密檔案*/
void encryptFile() {
// 待加密檔案路徑
char* normal_path = "E:\\poto\\xj.jpg";
// 加密後檔案路徑
char* encrypt_path = "E:\\poto\\xj_encrypt.jpg";
//開啟檔案
FILE* normal_fp = fopen(normal_path, "rb");
FILE* encrypt_fp = fopen(encrypt_path, "wb");
// 讀檔案
int buffer;
while ((buffer = fgetc(normal_fp)) != EOF) {
// 寫入檔案
fputc(buffer ^ 8, encrypt_fp);
}
printf("檔案加密成功\n");
// 關閉流
fclose(encrypt_fp);
fclose(normal_fp);
}
檔案解密
/*檔案解密*/
void decryptFile() {
// 加密檔案路徑
char* encrypt_path = "E:\\poto\\xj_encrypt.jpg";
// 解密檔案路徑
char* decrypt_path = "E:\\poto\\xj_deencrypt.jpg";
// 開啟檔案
FILE* encrypt_fp = fopen(encrypt_path, "rb");
FILE* decrypt_fp = fopen(decrypt_path, "wb");
// 讀取檔案
int buffer;
while ((buffer = fgetc(encrypt_fp)) != EOF) {
// 寫檔案
fputc(buffer ^ 8, decrypt_fp);
}
printf("檔案解密成功\n");
// 關閉流
fclose(decrypt_fp);
fclose(encrypt_fp);
}
瞭解了檔案加密的原理 , 我們也可以推匯出其他形式的加密 , 如帶密碼的檔案加密解密 , 混合檔案加密解密等等 。
不知不覺C語言基礎系列已經寫了快十篇了 , 也快告一段落了 , 有了這些基礎知識 , 我們就可以去分析分析jni.h標頭檔案了 , 下一個系列是jni開發系列 , 我們學C語言就是為了能和java打交道 , 那麼下個系列我們就來學習C與java的橋樑 , jni (Java Native Interface)技術 。
Android程式設計師學C系列:
C語言基礎及指標①
C語言基礎及指標②之指標記憶體分析
C語言基礎及指標③函式與二級指標
C語言基礎及指標④函式指標
C語言基礎及指標⑤動態記憶體分配
C語言基礎及指標⑥字元操作
C語言基礎及指標⑦結構體與指標
C語言基礎及指標⑧檔案IO
C語言基礎及指標⑨聯合體與列舉
C語言基礎及指標⑩預編譯及jni.h分析
相關文章
- C語言基礎-指標C語言指標
- C語言基礎-1、指標C語言指標
- C語言函式指標基礎C語言函式指標
- C語言指標和陣列基礎C語言指標陣列
- iOS開發 -- C語言基礎8(指標)iOSC語言指標
- C語言指標安全及指標使用問題C語言指標
- C語言程式設計基礎:指標陣列與陣列指標C語言程式設計指標陣列
- C語言 檔案IO的使用C語言
- C語言 C語言野指標C語言指標
- C語言(指標)C語言指標
- C語言指標C語言指標
- C語言語法基礎--S2函式和指標C語言函式指標
- C指標原理(15)-C指標基礎指標
- C指標原理(14)-C指標基礎指標
- C語言-指標操作C語言指標
- C語言rewind()函式:將檔案指標重新指向檔案開頭C語言函式指標
- C語言 - 標頭檔案包含C語言
- C語言fopen()函式:開啟一個檔案並返回檔案指標C語言函式指標
- C 語言的變數作用域及標頭檔案變數
- C語言指標(二) 指標變數 ----by xhxhC語言指標變數
- c語言指標彙總C語言指標
- C語言指標學習C語言指標
- c語言指標詳解C語言指標
- C語言 函式指標C語言函式指標
- C語言指標筆記C語言指標筆記
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- C語言之_雙重指標、多檔案、include、檔案C語言指標
- C語言:指標,C的靈魂C語言指標
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標
- C語言基礎C語言
- 搞清楚C語言指標C語言指標
- C語言 指標與陣列C語言指標陣列
- C語言指標基本知識C語言指標
- C語言指標詳解(一)C語言指標
- C語言指標詳解(二)C語言指標
- C語言指標用法大全C語言指標
- c語言實現this指標效果C語言指標
- C語言指標細節_1C語言指標