Stream merge: Difference between revisions
Content added Content deleted
m (C entry added) |
(C example added) |
||
Line 537: | Line 537: | ||
=={{header|C}}== |
=={{header|C}}== |
||
<lang C> |
<lang C> |
||
/* |
|||
* Rosetta Code - stream merge in C. |
|||
* |
|||
* Two streams of numbers (human readable files, integer numbers), |
|||
* C89, Visual Studio 2010, macros. |
|||
* |
|||
*/ |
|||
#define _CRT_SECURE_NO_WARNINGS |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#define GET(N) { if(fscanf(f##N,"%d",&b##N ) != 1) f##N = NULL; } |
|||
#define PUT(N) { printf("%d\n", b##N); GET(N) } |
|||
void merge(FILE* f1, FILE* f2, FILE* out) |
|||
{ |
|||
int b1; |
|||
int b2; |
|||
if(f1) GET(1) |
|||
if(f2) GET(2) |
|||
while ( f1 || f2 ) |
|||
{ |
|||
if ( !f1 ) while (f2 != NULL) PUT(2) |
|||
else if ( !f2 ) while (f1 != NULL) PUT(1) |
|||
else if ( b1 <= b2 ) PUT(1) |
|||
else PUT(2) |
|||
} |
|||
} |
|||
int main(int argc, char* argv[]) |
|||
{ |
|||
if ( argc < 3 || argc > 3 ) |
|||
{ |
|||
puts("streammerge filename1 filename2"); |
|||
exit(EXIT_FAILURE); |
|||
} |
|||
else |
|||
merge(fopen(argv[1],"r"),fopen(argv[2],"r"),stdout); |
|||
return EXIT_SUCCESS; |
|||
} |
|||
</lang> |
</lang> |
||
=={{header|Elixir}}== |
=={{header|Elixir}}== |
||
<lang elixir>defmodule StreamMerge do |
<lang elixir>defmodule StreamMerge do |