C語言文件讀寫操作
需求:按照要求查找一個文本文件中的某一行,將該行文本保存到另一個文本文件中,並在原文件中刪除該行
思路:首先獲取該文件中文本的行數,再按照要求(行號或行首的編號)找到該行,並記錄該行的行號,讀取並保存到另一個文本文件中,最后就是刪除原文件中的該行信息
C語言的文件操作函數中,並沒有刪除文件中某一行的函數,所以需要自己實現,實現思路如下:
首先用fgets函數將文件中的每行讀出(要刪除的那行除外,這就是為什么前面要獲取行數),保存到一個動態申請的二維數組中str[len][255](len為總行數,255為每行最大的字符數)
最后將str中的字符串一行一行的寫入到原來的文本文件中,首行用fopen(file, "w") , 以"W"的權限寫入就覆蓋掉了原來的信息,然后后面的其他行就以fopen(file, "a") ,”a“的權限添加到文件中
代碼:
獲取文件的文本行數:
int getlen(char const * file1) { FILE *fp = fopen(file1, "r"); char str[255]; int len = 0; while(fgets(str, 255, fp)) { len++; } fclose(fp); return len; }
找到要刪除的行,並返回行號
int lineFind(char const * file1, const int id, char * targetline, int len) { FILE *fp = fopen(file1, "r"); char strLine[255]; char str[7]; int num; len = 0; int lineNum = 0; while(fgets(strLine, 255, fp)) { strncpy(str, strLine, 6); str[6] = '\0'; if(id == strToInt(str)) { lineNUme = len; strncpy(targetLine, strLine, 255); } len ++; } fclose(fp); return lineNum; }
id 為要刪除行行首的編號,strToInt()函數是自己寫的,將字符串數字轉換成整數
將要刪除的行保存到另一個文本文件中
void lineCopy(char const * file2, char * strLine) { FILE *fp = fopen(file2, "a"); fprintf(fp, "%s", strLine); fclose(fp); }
刪除行
char * lineDelete(char const *file1, int len, int lineNum, char * src) { // 創建二維數組 char ** strget = (char ** )malloc(sizeof(char *) * len); int j; for(j=0;j<len;j++) { strget[j] = (char *)malloc(sizeof(char) * 255); } FILE *fp = fopen(file1, "r"); // 先獲取到所有行的文本 int i=0; while(fgets(strget[i], 255, fp)) { i++; } fclose(fp); //先寫入首行覆蓋原來的信息 FILE *fp1 = fopen(file1, "w"); fprintf(fp1, "%s", strget[0]); fclose(fp1); // 再寫入剩余的除刪除行外的其他行 FILE *fp2 = fopen(file1, "a"); for(i=1;i<len;i++) { if(i == lineNUm) { strcpy(src, strget[i]); continue; } fprintf(fp1, "%s", strget[i]); } fclose(fp2); // 釋放內存 for(i=0;i<len;i++) { free(strget[i]); } free(strget); return src; }