有许多的答案仅仅是普通的逐行打印,如果遇到有空行也不能识别,我的程序可以做到只打印有可打印字符的行,并且保留这些行的格式(花哨的输入和打开关闭文件检查从略)。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int printline(FILE *);//声明一个打印文件中有可打印内容的一行的函数,如果打印到文件末尾则返回0,否则返回1
int main(void)
{
int file1_stat=1,file2_stat=1;
int n=0;
char file1[40];
char file2[40];
scanf("%s %s",file1,file2);
FILE *fp1,*fp2;
fp1=fopen(file1,"r");
fp2=fopen(file2,"r");
do
{
if (file1_stat) //检查文件1状态,如果已到末尾则不再调用函数
{
file1_stat=printline(fp1);
putchar('\n');
}
if (file2_stat) //同上,检查文件2状态
{
file2_stat=printline(fp2);
putchar('\n');
}
}while(file1_stat || file2_stat);//如果两文件都到末尾则循环结束
fclose(fp1);
fclose(fp2);
return 0;
}
int printline(FILE *fp)
{
int stat=0,n=1;
int ch;
while(!stat)//如果遇到有可打印字符(stat==1)则终止循环,开始打印
{
while ((ch=getc(fp))!='\n' && ch!=EOF)//检查一行中有否可打印字符
{
if (!isspace(ch))//如果有可打印字符
{
fseek(fp,-n,SEEK_CUR);//则将光标退到行首,n为行字符计数器
stat=1;//标明有可打印字符
break;//只要遇到有一个可打印字符就退出检查
}
n++;//如果这个字符不是可打印字符则继续,计数器+1
}
n=1;//本行检查结束,计数器复原
if (ch==EOF) return 0;//如果直到末尾都没有可打印字符则返回0
}
while ((ch=getc(fp))!='\n' && ch!=EOF) putchar(ch);//退出前一个循环表示有字符需要打印,打印该行
if (ch==EOF) return 0;//检查打印的是否最后一行
return 1;
}