Can i use fgetc() or fputc() in a binary file?
You're using fgetc()
and fputc()
as you can see from the man page descriptions these function:
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.
fputc() writes the character c, cast to an unsigned char, to stream.
A character, in C, is defined by the standard to always be exactly 1 byte (8 bits), this means when you use fxxxc()
on a file you'll get 1 byte (that just happens to be a character in a text file).
If you extract and rebuild a binary file, byte by byte, you'll get an exact duplicate. So no, there is no issues with using fgetc()
and fputc()
on a binary file type. You can always prove this to yourself with a simple example program... for example:
int main()
{
FILE * fptr = fopen("small_pic.jpg", "rb"); // open existing binary picture
char buffer[10000] = {0}; // the pic is 6kb or so, so 10k bytes will hold it
FILE * fptr2 = fopen("new_small_pic.jpg", "wb"); // open a new binary file
// for our copy of the pic
unsigned long fileLen;
unsigned long counter;
fseek(fptr, 0, SEEK_END);
fileLen=ftell(fptr); // get the exact size of the pic
fseek(fptr, 0, SEEK_SET);
for(counter=0; counter<fileLen; counter++)
fputc(fgetc(fptr),fptr2); // read each byte of the small_pic.jpg and make
// a new pic from it
fclose(fptr);
fclose(fptr2);
return 0;
}
end result: we have two of the exact same images, because fgetc()
and fputc()
can be used on binary files.
Andrea Gottardi
I'm a 27-year-old guy, who lives in Lavis, Trento, Italy. I'm interested in every thing related to technology and IT, and I graduated in CS at the University of Trento (UniTN). EDM Music listener and basketball player, I also like everything that refers to the 8bit world, such as retrogaming.
Updated on June 18, 2022Comments
-
Andrea Gottardi almost 2 years
I am creating an archive program in C, and i want it to save files i provide, list and extract them.
I had many issues because i used a text file for saving, and it is not the best choice if i want to process binary files like music or photos, because when i extract them, they are not executed correctly (they are corrupted). In order to solve this problem, i wanted to create a binary archive file.Code for file writing (on extraction) is the following:
void scriviFile(const char * arrivo) //scrive i file creati in precedenza { FILE * partenza; FILE * target; int c; int spazio = 'a'; int i = 0; int pos; char * path; path = collegaSlash(getcwd(NULL, 0), nome); partenza = fopen(path, "rb"); fseek(partenza, inizio, SEEK_SET); target = fopen(arrivo, "wb"); //apro il file if (target) { //se è aperto while ((c = fgetc(partenza)) != EOF && ftell(partenza)<=fine-10) { //e il carattere preso non eccede la fine del file fputc(c, target); fputc(c, stdout); pos = ftell(partenza); if(pos==fine) { break; } //scrivo lo stesso carattere in out (file in uscita) } // fclose(target); //chiudo il file fclose(partenza); } else { printf("errore di scrittura del file \n"); } }
Since i need binary files to be extracted correctly, can i use code i wrote above, or do i have to change all
fgetc()
andfputc()
functions withfread()
andfwrite()
?Thanks
-
Gregor Watters Härtl about 2 yearsHey man great answer. Quick question: do the initialization brackets in your line with
char buffer[10000] = {0};
initialize each element in the array to a value of 0?