请问:C语言读写文件有关问题

请教:C语言读写文件问题
    下面这个程序的目的是从command line接收两个文件的文件名,然后判断哪个文件里的文本行数较多,最后将两个文件里的行号相同的文本打印在屏幕上的同一行里。但不知怎的,编译通过后运行时却老是出错,请帮忙看看是怎么回事。谢谢!

/* ex7, ch13, cl ver. */

#include <stdio.h>
#include <stdlib.h>

#define MAX 256

int main(int argc, char *argv[])
{
FILE * f1, *f2, *fp1, *fp2;
char buf1[MAX], buf2[MAX], ch, *buf = buf1;     //buf用作将从文件1中读出的一行去除换行符
        long cnt1 = 0, cnt2 = 0;

if(argc != 3)
{
printf("Usage: %s file1 file2", argv[0]);
exit(EXIT_FAILURE);
}
if((f1 = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "Error opening %s", argv[1]);
exit(EXIT_FAILURE);
}
if((f2 = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "Error opening %s", argv[2]);
exit(EXIT_FAILURE);
}
while((ch = getc(f1)) != EOF)   //以下是判断哪个文件行数较多
cnt1++;                 //将行数多的文件作为文件1
while((ch = getc(f2)) != EOF)
cnt2++;
if(cnt1 >= cnt2)
{
fp1 = f1;
fp2 = f2;
}
else
{
fp1 = f2;
fp2 = f1;
}
rewind(f1);                       //文件指针位置归零
rewind(f2);
while(fgets(buf, MAX, fp1) != NULL)   //从文件1中读取一行
{
while(*++buf != '\n')         //打印出这一行中除了换行符之外其他字符
                    putchar(*buf);            //问题也许就出在这里,但具体是什么问题就不清楚了
printf(" ");                            //两行在同一行打印,用空格隔开,以示区别
while(fgets(buf2, MAX, fp2) != NULL)   //从文件2中读取一行并接着刚从文件1
{                                      //读出并打印的那一行接着打印
puts(buf2);
break;
}
}
fclose(f1);
fclose(f2);

puts("\nEnd of Program.");

return 0;
}

------解决方案--------------------
文件结束时没有换行符,while死循环
------解决方案--------------------
请问:C语言读写文件有关问题
------解决方案--------------------
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

------解决方案--------------------
仅供参考
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);