Page 165

Write a program to compare two files, printing the first line where they differ.

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

#define MAX_LINE 1000

int main(int argc, char *argv[])
{
	if (argc != 3) {
		puts("error: exactly two file names must be provided");
		return 1;
	}

	char *fn1 = argv[1];
	char *fn2 = argv[2];

	FILE *fp1 = fopen(fn1, "r");
	FILE *fp2 = fopen(fn2, "r");

	if (fp1 == NULL) {
		printf("error: unable to read %s\n", fn1);
		return 2;
	}
	if (fp2 == NULL) {
		printf("error: unable to read %s\n", fn2);
		return 2;
	}

	char *line1 = (char *)malloc(sizeof(char) * MAX_LINE);
	char *line2 = (char *)malloc(sizeof(char) * MAX_LINE);
	int line_num = 0;

	do {
		++line_num;
		line1 = fgets(line1, MAX_LINE, fp1);
		line2 = fgets(line2, MAX_LINE, fp2);
	} while (line1 != NULL && line2 != NULL && strcmp(line1, line2) == 0);

	if (line1 == NULL && line2 == NULL) {
		puts("files do not differ");
	} else {
		printf("files differ at line %d\n", line_num);

		if (line1 != NULL) {
			puts(line1);
		} else {
			printf("end of file %s\n", fn1);
		}

		if (line2 != NULL) {
			puts(line2);
		} else {
			printf("end of file %s\n", fn2);
		}
	}
}