I’m trying to write a small piece of code that merges lines alternatively from two files and writes the results to another file, all specified by the user.
Except, at the moment it seems to be ignoring the ‘\0’ character and copies the entire file at a time, instead of a line at a time.
#include <stdio.h>
#include <stdbool.h>
int main (void)
{
char in1Name[64], in2Name[64], outName[64];
FILE *in1, *in2, *out;
printf("Enter the name of the first file to be copied: ");
scanf("%63s", in1Name);
printf("Enter the name of the second file to be copied: ");
scanf("%63s", in2Name);
printf("Enter the name of the output file: ");
scanf("%63s", outName);
// Open all files for reading or writing
if ( (in1 = fopen(in1Name, "r")) == NULL )
{
printf("Error reading %s", in1Name);
return 1;
}
if ( (in2 = fopen(in2Name, "r")) == NULL )
{
printf("Error reading %s", in2Name);
return 2;
}
if ( (out = fopen(outName, "w")) == NULL )
{
printf("Error writing to %s", outName);
return 3;
}
// Copy alternative lines to outFile
bool notFinished1 = true, notFinished2 = true;
int c1, c2;
while ( (notFinished1) || (notFinished2) )
{
while ( ((c1 = getc(in1)) != '\0') && (notFinished1) )
{
if (c1 == EOF)
{
notFinished1 = false;
}
else
{
putc(c1, out);
}
}
while ( ((c2 = getc(in2)) != '\0') && (notFinished2) )
{
if (c2 == EOF)
{
notFinished2 = false;
}
else
{
putc(c2, out);
}
}
}
// Close files and finish
fclose(in1);
fclose(in2);
fclose(out);
printf("Successfully copied to %s.\n", outName);
return 0;
}
The newline character is
'\n', not'\0'. The latter is a zero-valued (null) byte; inside C, it’s used to indicate the end of a string, but text-files don’t contain it.