Как перетасовать 2 разных текстовых файла в 1?

#c

#c

Вопрос:

 #include <stdio.h>

int main(){
    char temp[64];
    FILE *fp1=fopen("data/1.txt","a");
    FILE *fp2=fopen("data/2.txt","r");
    
    while(fgets(temp,64,fp2)!=NULL){
        fputs(temp,fp1);
    }
    
    fclose(fp1);
    fclose(fp2);
    return 0;
}
 

С помощью такого кода я смог объединить 2 разных текстовых файла в 1.

 data/1.txt contents: abcdefghijk
data/2.txt contents: ABCDE
Outcome: abcdefghijkABCDE
 

Тем не менее, я борюсь с перетасовкой 2 разных текстовых файла.

 Wanted result: aAbBcCdDeEfghijk
 

Ниже приведен мой текущий код.

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

int main(){
    FILE *fp1,*fp2,*fp_out;
    char ch1,ch2;

    int result=1;
    fp1=fopen("data/1.txt","r");
    fp2=fopen("data/2.txt","r");
    fp_out=fopen("data/out.txt","w");

//shuffling code area//

    fclose(fp1);
    fclose(fp2);
    fclose(fp_out);

    char buf[64]={};
    fp_out=fopen("data/out.txt","r");
    fgets(buf,64,fp_out);

    if(!strncmp("aAbBcCdDeEfghijk",buf,64))
        printf("PASSn");
    else
        printf("FAILn");

    fclose(fp_out);
    return 0;
}
 

Как я могу создать код в «области перетасовки кода», чтобы получить результаты, подобные желаемому результату? Я думал о создании 2 разных циклов FOR и объединении, но он продолжал показывать ошибку.

Комментарии:

1. Во-первых, это не похоже на перетасовку, а скорее на чередование . Тем не менее, подумайте, как вы могли бы использовать fgetc , а не fgets для достижения того, чего вы, кажется, желаете.

2. @Power of Knowledge Я создал простой код для этого! Надеюсь, это сработает для вас! Хорошего дня

Ответ №1:

Это какой-то грязный способ выполнить работу.

Вы можете сначала прочитать файл, в который хотите записать первый символ, а затем прочитать символ из второго файла и записать оба в третий файл один за другим.

Просто добавьте дополнительный код в соответствии с вашими потребностями.

Это работает только для вашего случая, не проверено на многих случаях и угловых случаях.

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

int main(){
    FILE *fp1,*fp2,*fp_out;
    char ch1,ch2;

    int result=1;
    
    int file1_content_over = 0;
    int file2_content_over = 0;
    
    fp1 = fopen("data/1.txt","r");
    fp2 = fopen("data/2.txt","r");
    fp_out=fopen("data/out.txt","w");

    //shuffling code area//

    // read till file1_content_over or file2_content_over is not finished
    while(! file1_content_over || !file2_content_over)
    {
        ch1 = fgetc(fp1);
        ch2 = fgetc(fp2);
        
        if(ch1 != EOF)
            fputc(ch1,fp_out);
        else
            file1_content_over = 1;

        if(ch2 != EOF)
            fputc(ch2,fp_out);
        else 
            file2_content_over = 1;
    }
    
    //shuffling code area//
    
    fclose(fp1);
    fclose(fp2);
    fclose(fp_out);
    
    char buf[64]={};
    fp_out=fopen("data/out.txt","r");
    fgets(buf,64,fp_out);
    printf("buf = %sn", buf);

    if(!strncmp("aAbBcCdDeEfghijk",buf,strlen("aAbBcCdDeEfghijk")))
        printf("PASSn");
    else
        printf("FAILn");

    fclose(fp_out);
    return 0;
}
 

Ответ №2:

Работает для меня! Не самый лучший оптимизированный код, у меня не было на это много времени!

Main():

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

#define MAX 100

int removingSPaces(char array[MAX], int sizeArray);
void orderChar(char bufFile1[MAX], char bufFile2[MAX], char bufOut[MAX], int maxSize, int sizeBuf1, int sizeBuf2);
int getChar(char buf[MAX], FILE *fp);

int main(){
    FILE *fp1, *fp2, *fpOut;
    char bufFile1[MAX] = {0}, bufFile2[MAX] = {0}, bufOut[MAX] = {0};
    int sizeBuf1 = 0, sizeBuf2 = 0;
    int maxSize=0;

    if((fp1=fopen("file1.txt","r")) == NULL || (fp2=fopen("file2.txt","r")) == NULL || (fpOut=fopen("fileOut.txt","w")) == NULL){
        perror("");
        exit(1);
    }
    
    sizeBuf1 = getChar(bufFile1, fp1); //geting the chars from file1
    fclose(fp1);

    sizeBuf1 = removingSPaces(bufFile1, sizeBuf1); //removing the n if exists from chars of file1

    sizeBuf2 = getChar(bufFile2, fp2); //geting the chars from file2
    fclose(fp2);

    sizeBuf2 = removingSPaces(bufFile2, sizeBuf2); //removing the n if exists from chars of file2

    maxSize = sizeBuf1   sizeBuf2; //Max Size to loop for

    orderChar(bufFile1, bufFile2, bufOut, maxSize, sizeBuf1, sizeBuf2); //Order the chars!

    fprintf(fpOut, "%s", bufOut); //Printing to the file

    fclose(fpOut);


/* COPIED FROM YOUR CODE */
    char buf[64]={0}; //Just added the 0, because you cant initialize the array like with only {} 
    
    if((fpOut=fopen("fileOut.txt", "r")) == NULL){
        perror("");
        exit(1);
    }

    fgets(buf,64, fpOut);

    if(!strncmp("aAbBcCdDeEfghijk", buf, 64))
        printf("PASSn");
    else
        printf("FAILn");

    fclose(fpOut);
/* COPIED FROM YOUR CODE */

    return 0;
}
 

Функции ():

 int removingSPaces(char array[MAX], int sizeArray){

    int size = sizeArray;

    if(array[sizeArray -1] == 'n'){
        array[sizeArray -1] = '';
        size = strlen(array);
    }
    return size;
}

int getChar(char buf[MAX], FILE *fp){
    char bufAux[MAX];
    int size;
    
    while(fgets(bufAux, sizeof(bufAux), fp)){
        size = strlen(bufAux);  
    }

    strcpy(buf, bufAux);
    return size; 
}

void orderChar(char bufFile1[MAX], char bufFile2[MAX], char bufOut[MAX], int maxSize, int sizeBuf1, int sizeBuf2){
    int positionsF1=0, positionsF2=0;
    int aux = 0; //This will starts organization by the first file! If you want to change it just change to 1;

    for(int i=0; i < maxSize; i  ){
        if(aux == 0 amp;amp; positionsF1 != sizeBuf1){ 
            bufOut[i]=bufFile1[positionsF1];
            if(positionsF2!=sizeBuf2){
                aux = 1;
            }
            positionsF1  ;
        }else if(aux == 1 amp;amp; positionsF2 != sizeBuf2){
            bufOut[i]=bufFile2[positionsF2];
            if(positionsF1!=sizeBuf1){
                aux = 0;
            }
            positionsF2  ;
        }
    }
}
 

Содержимое файла 1:

 abcdefghijk
 

Содержимое файла 2:

 ABCDE