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

3

我需要从两个不同的文件中读取并将单词打印到第三个文件中,首先我从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;
}

count 未初始化。 - yano
是的,但这不是最大的问题。谢谢。 - Rudolph
不要使用无用的 printf("error"),考虑采用 perror("error") 替代 - 它会提供一个可读的消息,告诉你出了什么问题! - Antti Haapala -- Слава Україні
1
使用未初始化的变量会导致未定义的行为。 count ++ 将添加到那里存在的任何垃圾值,不可能知道您的 for 循环将执行多少次。 - yano
1
fgetc 返回一个整型值。 - Antti Haapala -- Слава Україні
计数确实是个问题。你要循环直到达到计数,如果计数是4000000,那么你将会持续很长时间。 - pm100
1个回答

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,则第一个条件为假,但第二个条件为真。如果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);
            }
        }

除此之外,在进入for循环之前,firstsecond的文件指针都在文件末尾,因此没有可读取的内容。
在进入此循环之前,需要调用rewind(first)rewind(second)
最后,count未初始化。它可能包含一些随机大数,导致循环运行多次。确保将其设置为0:
int i=1,count=0;

谢谢,这解决了很多问题,但我的程序仍然无法将字符打印到第三个文件中。@dbush - Rudolph
@Rudolph 你在 for 循环之前添加了 rewind 调用吗? - dbush
你是神 @dbush - Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接