Byteorder.net: Order from Chaos, eight bits at a time.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum porta, diam at accumsan mollis, purus felis varius nibh, at bibendum nulla nisl eu libero. Aliquam erat volutpat. Quisque orci felis, pharetra vel, feugiat ut, eleifend vitae, sem. Nam adipiscing blandit tortor. Nulla dignissim tincidunt leo. Nulla scelerisque fermentum ipsum. Nunc at metus. In ac pede. Donec elit libero, vestibulum id, malesuada sed, cursus vitae, ligula. Praesent consequat, urna ut laoreet convallis, libero velit convallis quam, rhoncus cursus orci ipsum id mi. Quisque malesuada semper nunc. Nulla porttitor justo ut lacus. Fusce blandit tellus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas faucibus, quam at tristique facilisis, metus magna interdum arcu, vitae lobortis dui mauris ac risus.

Fusce quam. Aenean bibendum adipiscing metus. Etiam in felis. Vivamus sit amet erat eget velit bibendum sollicitudin. Donec molestie purus ac nibh. Ut dignissim, ligula id rhoncus consectetur, leo turpis dapibus tortor, nec hendrerit turpis velit a neque. Cras eu metus. Nullam sodales, tortor a molestie posuere, pede eros dictum lectus, nec sollicitudin lorem diam et velit. Maecenas dictum neque eget purus. Curabitur ac justo et odio congue euismod. Duis vitae felis ut nunc ultrices adipiscing. Vestibulum at tellus. Nunc in purus eget libero commodo posuere.

Coming soon: A Whole New Set of Tubes.

Comments welcome.
#include <stdio.h>

void usage(int argc,char *argv[]) {
	printf("%s: <infile> <outfile>\n",argv[0]);
	printf("Copy infile to outfile, producing sparse output if possible.\n");
}

int main(int argc, char* argv[]) {

	FILE *in;
	FILE *out;
	char buf;
	int res;

	if(argc < 3) {usage(argc,argv);return(1);}

	if(!(in = fopen(argv[1],"rb"))) {
		printf("Can't open %s for reading!\n",argv[1]);return(1);}
	if(!(out = fopen(argv[2],"wb"))) {
		printf("Can't open %s for writing!\n",argv[2]);return(1);}

	/* One byte at a time is probably a little slow,
	but will produce a perfectly compact output file */
	while (res = fread(&buf,1,1,in) ) {
		if (res < 1) {fflush(out);fclose(out);fclose(in);return(0);}
		/* The only difference between a dense and sparse file
		is that we seek instead of writing zeros.  That is, in
		a sparse file, the zeros are implied. */
		if (buf == 0) {
			res=fseek(out,1,SEEK_CUR);
			if (res) {
				printf("Seek error in destination\n");
				return(1);
			}
		} else {
			res=fwrite(&buf,1,1,out);
			if (res<1) {
				printf("Write error in destination\n");
				return(1);
			}
		}
	}

	/*Can't need this, but just in case*/
	fclose(in);
	fflush(out);
	fclose(out);

	return(0);

}