C语言文件读写操作
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; }
知行合一,
翻万卷书,游千里路,会百家才