[英]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.