[英]difference between getc and fscanf
為什么以下代碼工作正常:
#include<stdio.h>
int main()
{
FILE *fp=fopen("input.txt","r+");
char c;
while((c=getc(fp))!=EOF)
{
printf("%c",c);
}
fclose(fp);
return 0;
}
但是這段代碼給出了錯誤“分段錯誤,核心轉儲”:
#include<stdio.h>
int main()
{
FILE *fp=fopen("input.txt","r+");
char c;
while((c=fscanf(fp,"%c",&c))!=EOF)
{
printf("%c",c);
}
fclose(fp);
return 0;
}
input.txt包含一個空格分隔的字符列表,如:abcdef
這不會像你期望的那樣工作:
while((c=fscanf(fp,"%c",&c))!=EOF)
getc()
返回字符讀取,可以是EOF
,但fscanf()
返回分配的輸入項數,如果在發生任何轉換之前發生故障,則返回EOF
。
您不能將此返回值分配給c
,因為返回值不是讀取的字符(稍后您嘗試打印)。
你應該試試這個:
while(fscanf(fp,"%c",&c) == 1)
要么:
while(fscanf(fp,"%c",&c) != EOF)
這相當於說“只要有一個字符可讀......”
此外,在第一種情況下(使用getc()
的代碼), c
應該是int - 如果目標平台使用無符號字符,則可以有無限循環,因為c
將始終轉換為正int(同樣,僅在具有無符號字符的平台中),因此永遠不會等於EOF
。 如果檢查getc()
和putc()
(以及處理字符的其他函數putc()
的聯機幫助頁,您將看到它們接收int
,而不是char
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.