C語言學習筆記之檔案的分割與合併

2021-07-14 11:45:22 字數 2036 閱讀 3956

2. 合併:將每段臨時檔案依次讀取,然後寫入到要合併成的新檔案

1. 檔案開啟後記得要關閉

2. 對檔案開啟的狀態進行判斷,處理異常

3. fgets函式會獲取行尾的\n,必要時進行相關處理,fputs輸入字串時不會自動新增\n

4. 對最後一塊的長度進行特殊處理,因為它不一定等於每一塊的長度

5. 對操作的分割合併的檔案使用二進位制的模式進行開啟

6. 注意feof函式的使用,在檔案指標指向eof時,下一次讀取feof才會返回1

分割檔案
#define  _crt_secure_no_warnings

#include

#include

#include

#define n 6 // 定義分割塊數

void mainx()

fseek(fsrc, 0, seek_end);

int flen = ftell(fsrc); // 檔案長度

//printf("檔案長度:%d\n", flen);

int blocklen = flen / n; // 每一塊的長度

//printf("blocklen:%d\n", blocklen);

file *ftmp; // 臨時檔案,

for (int i = 0; i < n; i++) // 按塊分割

fputs(tdir, div); // 寫入檔名

fputc('\n',div);

int offset = i*blocklen; //計算偏移量

fseek(fsrc, offset, seek_set);

intcount = 0; //統計寫入ftmp的數量

if (i == n - 1) blocklen = flen - blocklen*(n - 1); //最後一塊的長度

while (count

count++;

}printf("count:%d\n", count);

fclose(ftmp);

}fclose(fsrc);

fclose(div);

system("pause");

}

合併檔案
#define  _crt_secure_no_warnings

#include

#include

#include

void main()

char tempname[60];

file *tempfile;

// 迴圈讀出temp檔案路徑,並進行檔案的合併

while (fgets(tempname, 60, div)) // fgets讀取到字串時返回非0,否則返回0

// feof判斷檔案結尾

// 當檔案內部的位置指標指向檔案結束時,並不會立即設定file結構中的檔案結束標識,

// 只有再執行一次讀檔案操作,才會設定結束標誌,此後呼叫feof()才會返回為真。

// 問題**

//while (!feof(tempfile)) // 問題**,每次合併多寫入乙個eof(-1)

//printf("正在合併%s到新檔案\n",tempname);

// 修正後的**

int ch = fgetc(tempfile);//在用feof前先讀取乙個字元

//判斷你上面讀取的ch是否為結束符,feof在讀取到eof才會返回1,

//即若ch為eof,則while迴圈不會進入,而當ch為eof的前一次讀取時,while迴圈仍會繼續。

while (!feof(tempfile))

fclose(tempfile);

}fclose(fdest);

fclose(div);

system("pause");

}

效果圖

c語言學習筆記之檔案操作

1 static 和extern使用 1 修飾區域性變數 static修飾區域性變數特點 延長區域性變數的生命週期 extern不能修飾區域性變數 2 修飾全域性變數 static修飾全域性變數 是乙個內部變數,只能在本檔案使用。extern修飾全域性變數 是乙個外部變數,可以在本檔案和其他檔案使用...

C語言學習筆記之檔案的寫入

程式開頭需要建立乙個指向檔案型別的指標 file fp fopen 函式 fp fopen filename,w 當fopen返回值為null時,表明開啟檔案失敗,或者是未能成功建立檔案。因此可使用該函式的返回值來判斷是否成功建立檔案。fclose 檔案指標 fclose fp 當檔案順利關閉時,f...

C語言學習筆記之輸入與輸出

單個字元 c 字串 s ascii表對應的值 ascii表原圖 常用的對應關係 a z 65 90 a z 97 122 0 9 48 57 因此,字元和整數沒有本質的區別。char變數在記憶體中儲存的是字元對應的ascii值。include intmain 強制型別轉換 自動型別轉換 無論是強制轉...