Чтение из двух разных файлов и печать в третий - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно прочитать из 2 разных файлов и напечатать слова в третий, сначала я читаю из файла 1 и сохраняю первое слово в файл третье, затем читаю из файла 2 и сохраняю первое слово отсюда в третий файл как второе слово и так далее... а также слова из файла1 имеют "+" в начале слова и из файла2 имеют "-".Моя проблема заключается в том, что код не останавливается и все еще работает и печатает третий файл "." (Много точек).спасибо

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

int main(){
    FILE *first, *second, *third;
    char ch[256],ch1[256],ch2;
    int i=1,count;
    char space = ' ';
    char minus = '-';
    char plus = '+';

    first=fopen("prvy.txt", "r");
    second=fopen("druhy.txt", "r");
    third=fopen("treti.txt", "w");

        if(first==NULL || second==NULL || third==NULL)
        {
        printf("error");
        exit(1);
        }

        while (fscanf(first, "%255s", ch) == 1)
        {
            count++;
        }

        while (fscanf(second, "%255s", ch) == 1)
        {
            count++;
        }

        printf("%d",count);

        for(i;i<=count;i++)
        {
            if(i%2==1)
            {
                fputc(plus,third);
                ch2=fgetc(first);
                while(ch2 != EOF || ch2 != ' ')
                    putc(ch2,third);
                    ch2=fgetc(first);
            }
            else if(i%2==0)
            {
                fputc(minus,third);
                ch2=fgetc(second);
                while(ch2 != EOF || ch2 != ' ')
                    putc(ch2,third);
                    ch2=fgetc(second);
            }
                fputc(space,third);         
        }


    fclose(first);
    fclose(second);
    fclose(third);

    return 0;
}

1 Ответ

0 голосов
/ 12 ноября 2018

Взгляните на две while петли здесь:

        if(i%2==1)
        {
            fputc(plus,third);
            ch2=fgetc(first);
            while(ch2 != EOF || ch2 != ' ')
                putc(ch2,third);
                ch2=fgetc(first);
        }
        else if(i%2==0)
        {
            fputc(minus,third);
            ch2=fgetc(second);
            while(ch2 != EOF || ch2 != ' ')
                putc(ch2,third);
                ch2=fgetc(second);
        }

Первая проблема заключается в том, что ch2 != EOF || ch2 != ' ' всегда будет правдой. Если ch2 - EOF, первое условие ложно, а второе - истина. Если ch2 - это пробел, второе условие будет ложным, а первое будет истинным. Если это не так, оба верны.

Вы хотите проверить, является ли ch оба не EOF и не пробел:

while(ch2 != EOF && ch2 != ' ')

Это будет работать, если бы не это:

char ch[256],ch1[256],ch2;

ch2 определено как char, а fgetc возвращает int. Значение EOF выходит за пределы диапазона char, поэтому вы никогда не увидите это значение. Измените его на int:

char ch[256],ch1[256]
int ch2;

Ваши while петли также не имеют никаких скобок вокруг них. Итак, что у вас есть на самом деле:

            while(ch2 != EOF || ch2 != ' ') {
                putc(ch2,third);
            }
            ch2=fgetc(first);

ch2 никогда не изменяется внутри цикла, поэтому у вас есть бесконечный цикл. Положите фигурные скобки там, где они должны:

        if(i%2==1)
        {
            fputc(plus,third);
            ch2=fgetc(first);
            while(ch2 != EOF && ch2 != ' ') {
                putc(ch2,third);
                ch2=fgetc(first);
            }
        }
        else if(i%2==0)
        {
            fputc(minus,third);
            ch2=fgetc(second);
            while(ch2 != EOF && ch2 != ' ') {
                putc(ch2,third);
                ch2=fgetc(second);
            }
        }

Кроме того, файловые указатели для first и second находятся в конце каждого файла перед входом в цикл for, поэтому читать нечего.

Вам нужно позвонить rewind(first) и rewind(second) перед входом в этот цикл.

Наконец, count не инициализируется. Он может содержать случайное большое число, поэтому ваш цикл может выполняться намного больше, чем вы предполагаете.

Обязательно установите значение 0:

int i=1,count=0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...