简体   繁体   中英

difference between getc and fscanf

why does the following code work fine:

#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;
}

but this code gives an error 'segmentation fault, core dumped':

#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 contains a space separated list of characters like: abcdef

This will not work the way you expect:

while((c=fscanf(fp,"%c",&c))!=EOF)

getc() returns the character read, which can be EOF , but fscanf() returns the number of input items assigned, or EOF if there was a failure before any conversion took place.

You can't assign this return value to c , because the return value is not the character read (which you then try to print later).

You should try this instead:

while(fscanf(fp,"%c",&c) == 1)

Or:

while(fscanf(fp,"%c",&c) != EOF)

Which is equivalent to saying "As long as there is a character to read..."

Also, in the first case (the code where you use getc() ), c should be int - you can have an infinite loop if the target platform uses unsigned chars, because c will always be converted to a positive int (again, only in platforms with unsigned chars), and thus will never be equal to EOF . If you check the manpages for getc() and putc() (and other functions that deal with a character), you will see that they receive int , not char .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM