I've run into a problem solution to which I can't find.
I'm combining two text files into a third one and I want to keep track of the data I'm moving. So far, the code does one thing and absolutely ignores other.
Here is the code:
// enable standard c i/o functions
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
// Open two files to be merged
FILE *fp1 = fopen("test1.txt", "r");
FILE *fp2 = fopen("test2.txt", "r");
// Open file to store the result
FILE *fp3 = fopen("results.txt", "w+");
char c;
int count2ch = 0; // count meter for characters
int count1ch = 0; // count meter for characters
int totalch = 0; // holds number of total ammount of characters
int count1wd = 0; // count meter for words
int count2wd = 0; // count meter for words
int totalWD = 0;// holds total ammount of words
// Check files
if (fp1 == NULL || fp2 == NULL || fp3 == NULL)
{
puts("Could not open file");
exit(0);
}
// COUNTING CHARACTERS
// count characters file one
while (1)
{
c = fgetc(fp1);
if (c == EOF)
break;
count1ch++;
}
// count characters file two
while (1)
{
c = fgetc(fp2);
if (c == EOF)
break;
count2ch++;
}
//MERGING FILES
// Copy contents of first file to file3.txt
while ((c = fgetc(fp1)) != EOF)
fputc(c, fp3);
// Copy contents of second file to file3.txt
while ((c = fgetc(fp2)) != EOF)
fputc(c, fp3);
// COUNTING WORDS
//count words file one
while ((c = fgetc(fp1)) != EOF)
{
if (c == ' ')
count1wd++;
}
//count words file two
while ((c = fgetc(fp2)) != EOF)
{
if (c == ' ')
count2wd++;
}
// count total ammount of words
totalWD = count1wd + count2wd;
// count total ammount of characters
totalch = count1ch + count2ch;
printf("Merged file1.txt and file2.txt into file3.txt \n");
printf("Total number of characters moved: %d\n", totalch);
printf("The ammount of chars in your first file is : %d\n", count1ch);
printf("The ammount of chars in your second file is : %d\n", count2ch);
printf("Total number of words moved: %d\n", totalWD);
printf("The ammount of words in your fist file is : %d\n", count1wd);
printf("The ammount of words in your second file is : %d\n", count2wd);
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
Now, it just combines two files into the third one and that's it. If I move the counting words or characters section above the merging section, the code will do whatever comes first.
Here's your code refined. The only differences are simplified variable names, the print statements moved to a function, and most importantly, the addition of the rewind()
function to rewind your file pointers after use. The formatting is also my style, so if you want to change that then feel free.
#include <stdio.h>
#include <stdlib.h>
void printCtrs(int, int, int, int, int, int);
void printCtrs(int ttlCh, int c1ch, int c2ch, int ttlWD, int c1wd, int c2wd){
printf("Merged file1.txt and file2.txt into file3.txt \n");
printf("Total number of characters moved: %d\n", ttlCh);
printf("The ammount of chars in your first file is : %d\n", c1ch);
printf("The ammount of chars in your second file is : %d\n", c2ch);
printf("Total number of words moved: %d\n", ttlWD);
printf("The ammount of words in your fist file is : %d\n", c1wd);
printf("The ammount of words in your second file is : %d\n", c2wd);
}
int main(){
// Open files for reading/writing
FILE *fp1, *fp2, *fp3;
fp1 = fopen("test1.txt", "r");
fp2 = fopen("test2.txt", "r");
fp3 = fopen("results.txt", "w+");
// Declaring counters
char c;
int ttlCh = 0, c1ch = 0, c2ch = 0,
ttlWD = 0, c1wd = 0, c2wd = 0;
// If any files fail to open, abort
if (fp1 == NULL){
puts("Could not open file fp1");
exit(0);
}
if (fp2 == NULL){
puts("Could not open file fp2");
exit(0);
}
if (fp3 == NULL){
puts("Could not open file fp3");
exit(0);
}
// Read through files 1 and 2 and count characters
while (c = fgetc(fp1) != EOF){ c1ch++; }
rewind(fp1); // Reset file pointer 1 to start of file
while (c = fgetc(fp2) != EOF){ c2ch++; }
rewind(fp2); // Reset file pointer 2 to start of file
// Write file 1 and 2 to 3
while ((c = fgetc(fp1)) != EOF){ fprintf(fp3, "%c", c); }
while ((c = fgetc(fp2)) != EOF){ fprintf(fp3, "%c", c); }
// Count total words in 1 and 2
while ((c = fgetc(fp1)) != EOF){
if (c == ' '){ c1wd++; }
}
while ((c = fgetc(fp2)) != EOF){
if (c == ' '){ c2wd++; }
}
ttlWD = c1wd + c2wd;
ttlCh = c1ch + c2ch;
// Print counters
printCtrs(ttlCh, c1ch, c2ch, ttlWD, c1wd, c2wd);
// Close all files after use
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.