Both getc() and fgetc() are functions used to read a single character from a file stream. These functions belong to the C language standard library's input/output functions, but they have several distinctions:
-
Definition:
-
fgetc() is a standard library function strictly defined in the
<stdio.h>header file. Its prototype is:cint fgetc(FILE *stream);This function reads the next character (an unsigned character) from the specified file stream
streamand returns it as anint. -
getc() is typically implemented as a macro, though it can also be implemented as a function. It is defined in the
<stdio.h>header file and has functionality similar to fgetc(). A typical implementation might be:c#define getc(stream) fgetc(stream)Or it could be a more complex macro that considers performance optimization and other factors.
-
-
Performance:
- Since getc() can be implemented as a macro, the compiler may optimize it, potentially making it faster than fgetc() in some cases. However, this performance gain depends on the specific compiler and its optimization settings.
-
Error Handling and Thread Safety:
- fgetc(), as a standard function, guarantees thread safety, meaning it is safe to use in multi-threaded environments.
- getc(), if implemented as a macro, may not be thread-safe because macros simply replace text without handling race conditions introduced by multi-threading. However, if getc() is provided as a function, it can also be thread-safe.
-
Usage Scenarios:
- fgetc() is typically used in scenarios where thread safety is required.
- getc() may be used in single-threaded applications, especially when performance is a key consideration.
Example:
Assume we have a file example.txt that we want to read. An example using fgetc() is:
c#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Failed to open file"); return 1; } int ch; while ((ch = fgetc(file)) != EOF) { putchar(ch); } fclose(file); return 0; }
An example using getc() is very similar, with the function call differing:
c#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Failed to open file"); return 1; } int ch; while ((ch = getc(file)) != EOF) { putchar(ch); } fclose(file); return 0; }
In practice, the choice between these functions depends on specific requirements, including performance needs and thread safety considerations.