i am trying to read a file in c. i have a .txt file and it has that content:
file_one.txt file_two.txt file_three.txt file_four.txt
when i try to read this file with fopen i get this output:
file_one.txt file_two.txt file_three.txt file_four.txt\377
what does \377 mean? Here's my code.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]){
FILE *filelist;
char ch;
filelist=fopen("file-path", "rt");
while (!feof(filelist)) {
ch = getc(filelist);
printf("%c",ch);
}
fclose(filelist);
return 0;
}
The
getc()
function returns a result of typeint
, not of typechar
. Yourchar ch;
should beint ch;
.Why does it return an
int
? Because the value it returns is either the character it just read (as anunsigned char
converted toint
) or the special valueEOF
(typically -1) to indicate either an input error or an end-of-file condition.Don't use the
feof()
function to detect the end of input. It returns true only after you've run out of input. Your last call togetc()
is returningEOF
, which when stored into achar
object is converted to(char)-1
, which is typically'\377'
.Another problem is that
feof()
will never return a true value if there was an input error; in that case,ferror()
will return true. Usefeof()
and/orferror()
aftergetc()
returnsEOF
, to tell why it returnedEOF
.To read from a file until you reach the end of it:
Suggested reading: Section 12 of the comp.lang.c FAQ.
The
\377
is an octal escape sequence, decimal 255, all bits set. It comes from convertingEOF
- which usually has the value-1
- to achar
, due tofeof(filelist)
only becoming true after you have tried to read past the file.So at the end of the file, you enter the loop once more, and the
getc()
returnsEOF
.