从两个不同的文件读取并打印到第三个文件

时间:2018-11-12 17:35:37

标签: c file

我需要从2个不同的文件中读取并将单词打印到第三个单词,首先我从file1中读取并将第一个单词保存到文件中第三个,然后从file2中读取并将第一个单词从此处保存到第二个单词中作为第二个单词,依此类推..以及file1中的单词在单词开头都带有“ +”,file2中的单词带有“-”。我的问题是代码不会停止并且仍在工作,并且可以将其打印到第三个文件“。”(许多点)。谢谢

#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 :(得分:2)

在这里看看两个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,则第一个条件为false,但第二个条件为true。如果ch2是空格,则第二个条件为false,第一个条件为true。如果两者都不是,则都为真。

您要检查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循环之前,secondfor的文件指针都在每个文件的末尾,所以没有什么可读取的。

进入此循环之前,您需要调用rewind(first)rewind(second)

最后,count未初始化。它可能包含一些随机的大数字,因此您的循环可能比您预期的运行更多次。

请务必将其设置为0:

int i=1,count=0;