簡體   English   中英

使程序停止讀取文件(如果是EOF)而僅從其他文件讀取

[英]Making program to stop reading from file if EOF and read only from other

唯一的問題是,當一個文件位於EOF時,程序仍會寫入-或+,只需要設置一些條件,以使它僅在另一個文件處於EOF時才取一個文件中的單詞。 例如

prvy.txt: Ahojte nasi studenti ktori maju radi programovanie

druhy.txt: vsetci mili

treti.txt: + Ahojte -vsetci + nasi -mili + studenti + ktori + maju + radi + programovanie

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

int main(){
    FILE *first, *second, *third;
    char ch[256],ch1[256];
    int i=1,count=0, ch2;
    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)
    {
        perror("error");
        exit(1);
    }

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

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

    printf("%d",count);

    rewind(first);
    rewind(second);

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

            fputc(minus,third);
            ch2=fgetc(second);
            while(ch2 != EOF && ch2 != ' ' && ch2 != '\n') {
                putc(ch2,third);
                ch2=fgetc(second);
            }
        }
        putc(space,third);
    }   

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

    return 0;
}

您的代碼將在兩個文件之間交替。 這將不起作用,因為文件可能包含不同數量的單詞。

一種解決方案是在每個文件的一個變量中計算單詞數。 然后,循環可能類似於:

 // count1: number of words in first file
 // count2: number of words in second file
while(count1 > 0 || count2 > 0)
{
    if (count1 > 0)
    {
        fputc(plus,third);
        ch2=fgetc(first);
        while(ch2 != EOF && ch2 != ' ' && ch2 != '\n') {
            putc(ch2,third);
            ch2=fgetc(first);
        }
        --count1;
    }

    if (count2 > 0)
    {
        fputc(minus,third);
        ch2=fgetc(second);
        while(ch2 != EOF && ch2 != ' ' && ch2 != '\n') {
            putc(ch2,third);
            ch2=fgetc(second);
        }
        --count2;
    }

    putc(space,third);
}   

您無需先掃描兩個文件即可計數。 而是創建一個包含兩個輸入文件的數組,並在閱讀時使用索引在兩個輸入文件之間切換。 當輪到一個文件用盡時,掃描並打印另一個文件。

這樣,您就無需同時控制兩個文件的成功輸入:

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

int main(void)
{
    FILE *in[2];                        // Two alternating input files
    FILE *out;

    char line[80];
    char prefix[] = "+-";               // Alternating signs, +/-
    int index = 0;                      // index to in[] and prefix[]

    in[0] = fopen("1.txt", "r");
    in[1] = fopen("2.txt", "r");
    out = fopen("3.txt", "w");

    if (!(in[0] && in[1] && out)) {
        perror("fopen");
        exit(1);
    }

    while (fscanf(in[index], "%79s", line) == 1) {
        fprintf(out, "%c%s ", prefix[index], line);

        index = !index;
    }

    while (fscanf(in[!index], "%79s", line) == 1) {
        fprintf(out, "%c%s ", prefix[!index], line);
    }

    fclose(in[0]);
    fclose(in[1]);
    fclose(out);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM