C语言文件操作实例:删除文件中的空行,筛选出开头特征行,每行判断是否含有字串

今天遇到一个C语言文件操作问题,花费了很长时间,发现自己的C语言文件操作学的不怎么样,特此记录。

题目要求:

  • 一个多行文件里面,需要删除多余的空白行
  • 将<<<和...开头的行放入a.txt文件中
  • 将包含"Python"子串的行提取出来,放入b文件中

思路:

  • 暂时没有想到可以直接在一个文件里面删除空行的方法,于是思路就是新建一个临时文件,然后再删掉
  • 匹配开头为<<<和...的行比较容易
  • 寻找包含"Python"字串的行可以使用kmp算法匹配

代码:

#include 
#define N 1024
#define maxn 10010

void preKMP(char x[] , int m , int kmpNext[])
{
	int i , j;
	j = kmpNext[0] = -1;
	i = 0;
	while(i < m){
		while(-1!=j && x[i]!=x[j]) j=kmpNext[j];
		if(x[++i]==x[++j]) kmpNext[i]=kmpNext[j];
		else kmpNext[i]=j;
	}
}
int Next[maxn];
int KMP_count(char x[] , int m , char y[] , int n){
	int i , j;
	int ans = 0;
	preKMP(x,m,Next);
	i = j =0;
	while(i < n){
		while(-1!=j && y[i]!=x[j]) j = Next[j];
		i++;j++;
		if(j >= m){
			ans++;
			j = Next[j];
		}
	}
	return ans;
}

int main(int argc, char const *argv[])
{
	FILE *fp = fopen("data.txt", "r");
	FILE *fp1 = fopen("cache.txt", "a");
	char text[N];
	while(fgets(text, sizeof(text), fp)){
		if (text[0] == '\n')
		{
			// 如果是空行,则跳过
			continue;
		}else{
			// 否则就保存到另一个文件中
			fputs(text, fp1);
		}
	}
	fclose(fp);
	fclose(fp1);
	FILE *fp2 = fopen("data.txt", "w");
	FILE *fp4 = fopen("cache.txt", "r");
	while(fgets(text, sizeof(text), fp4)){
		fputs(text, fp2);
	}
	fclose(fp2);
	fclose(fp4);
	remove("cache.txt");

	FILE *fp3 = fopen("data.txt", "r");
	FILE *fp_a = fopen("a.txt", "a");
	FILE *fp_b = fopen("b.txt", "a");
	while(fgets(text, sizeof(text), fp3)){
		if (text[0] == '<' && text[1] == '<' && text[2] == '<')
		{
			fputs(text, fp_a);
		}
		if (text[0] == '.' && text[1] == '.' && text[2] == '.')
		{
			fputs(text, fp_a);
		}
	}
	fclose(fp3);
	FILE *fp5 = fopen("data.txt", "r");
	char* substr = "Python";
	while(fgets(text, sizeof(text), fp5)){
		if(KMP_count(substr, 6, text, sizeof(text))){
			fputs(text, fp_b);
		}else{
			continue;
		}
	}
	fclose(fp5);
	fclose(fp_a);
	fclose(fp_b);
	return 0;
}

由于要求使用C语言的文件操作函数,基本快忘了。。最近补补吧

你可能感兴趣的:(C/C++)