簡體   English   中英

使用EOF代替feof

[英]using EOF instead of feof

#include <stdio.h>
  int main() {
        FILE *fp1, *fp2, *fp3;
        int n, i, num, flag = 0;
        /* open files to write even, odd seperately */
        fp1 = fopen("data.txt", "r");
        fp2 = fopen("even.txt", "w");
        fp3 = fopen("odd.txt", "w");

        fprintf(fp2, "Even Numbers:\n");
        fprintf(fp3, "Odd Numbers:\n");

        /* print even, odd and prime numbers in separate files */
        while (!feof(fp1)) {
                fscanf(fp1, "%d", &num);
                if (num % 2 == 0) {
                        fprintf(fp2, "%d ", num);
                } else {
                        if (num > 1) {
                                for (i = 2; i < num; i++) {
                                        if (num % i == 0) {
                                                flag = 1;
                                                break;
                                        }
                                }
                        }
                        fprintf(fp3, "%d ", num);
                        flag = 0;
                }
        }
        fprintf(fp2, "\n");
        fprintf(fp3, "\n");

        fclose(fp1);
        fclose(fp2);
        fclose(fp3);
        return 0;
  }

我想使用EOF代替feof。 我已經嘗試過!EOF = fp1,但它不起作用並給出錯誤。 我只想用EOF代替feof。 誰能指出我的代碼出了什么問題?

到達文件結尾時, fscanf返回EOF

曼斯卡夫

 #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); 

[...]

scanf()函數從標准輸入流stdin讀取輸入, fscanf()從流指針stream讀取輸入, sscanf()str指向的字符串中讀取輸入。

[...]

返回值

成功后,這些函數將返回成功匹配和分配的輸入項的數量; 如果較早匹配失敗,則該值可以小於所提供的值,甚至為零。

如果在第一次成功轉換或匹配失敗發生之前到達輸入結束,則返回EOF值。 如果發生讀取錯誤,也會返回EOF ,在這種情況下,將設置流的錯誤指示符(請參閱ferror(3)),並errno來指示錯誤。

一種解決方案是將fscanf的返回值保存在int變量中,然后再次檢查它的0和EOF ,如下所示:

如果您想繼續使用fscanf

int ret;
while((ret = fscanf(fp1, "%d, &num)) != EOF)
{
    if(ret == 0)
    {
        // fscanf failed to convert the input
        // let it consume a charatcer and try again.
        getc(fp1);
        continue;
    }

    if(num % 2 == 0)
        ...
}

編輯

避免使用feof來控制while(!feof(fp)這樣的文件的循環,有關更多信息,請參見為什么“ while(!feof(file))”總是錯誤的?


編輯2

這是我最初的想法,但正如喬納森·萊夫勒(Jonathan Leffler)在評論中指出的那樣:

喬納森·萊夫勒(Jonathan Leffler)寫道:

您的第一個解決方案要求每行只有一個數字,問題中的代碼不會

他是對的,我沒看到。

我從過去

一種選擇是使用fgets逐行讀取輸入,然后使用sscanf解析行:

 char buffer[1024]; while(fgets(buffer, sizeof buffer, fp1)) { if(sscanf(buffer, "%d", &num) != 1) { fprintf(stderr, "Could not read an integer, ignoring line\\n"); continue; } if (num % 2 == 0) ... } 

while循環的條件應該是fscanf()語句本身。 EOF始終是整數。 請參見fscanf()手冊頁

返回值

fscanf()函數返回成功轉換和分配的字段數。 返回值不包括fscanf()函數讀取但未分配的字段。

如果在任何轉換之前發生輸入失敗,則返回值為EOF;如果成功,則返回值為分配的輸入項數。

而且,像其他所有人一樣,我會向您推薦為什么while ( !feof (file) )總是錯誤的? 對於新C程序員來說,這是有關Stack Overflow的必讀內容。

#include <stdio.h>

int main(void) {
    FILE *fp1, *fp2, *fp3;
    int n, i, num, flag = 0, ret;

    /* fopen files */

    while ((ret = fscanf(fp1, "%d", &num)) != EOF) {
        if (ret == 0) {
            getc(fp1);
            continue;
        }
        if (num % 2 == 0) {
            fprintf(fp2, "%d ", num);
        }
        /* rest of the loop here */
    }

    /* fclose files */
}

如果fscanf()無法讀取一個字符,但不返回EOF,則它通常可以解決getc() ,以使緩沖區前進一個字符。 scanf()獲取用戶輸入后,使用getchar()推進stdin時,此方法也適用。

暫無
暫無

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

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