c语言中文件的结尾指的是文件的最后一个字符的下一个字符
例如:文件a.txt中有三个字符abc,即文件大小为3
那么文件的实际内容如下图.
echo -n abc > a.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h>
#include <stdlib.h>
int
main(
void
){
FILE
* fp =
fopen
(
"a.txt"
,
"r"
);
if
(NULL==fp){
perror
(
"fopen"
),
exit
(-1);
}
int
c;
while
(!
feof
(fp)){
//当文件指针第一次到达文件结尾处时,feof函数返回的是0.
c =
getc
(fp);
printf
(
"c=%d\n"
,c);
if
(
ferror
(fp)){
perror
(
"ferror"
),
exit
(-1);
}
}
fclose
(fp);
return
0;
}
|
c=97
c=98
c=99
c=-1
所以正确做法应该是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
#include <stdlib.h>
int
main(
void
){
FILE
* fp =
fopen
(
"a.txt"
,
"r"
);
if
(NULL==fp){
perror
(
"fopen"
),
exit
(-1);
}
int
c;
while
((c=
getc
(fp))!=EOF){
printf
(
"c=%d\n"
,c);
if
(
ferror
(fp)){
perror
(
"ferror"
),
exit
(-1);
}
}
return
0;
}
|
c=97
c=98
c=99
如何读出文件最后一个字符c,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
int
main(
void
){
FILE
* fp =
fopen
(
"a.txt"
,
"r"
);
fseek
(fp,-1,SEEK_END);
char
c;
c =
getc
(fp);
printf
(
"c=%d\n"
,c);
fseek
(fp,0,SEEK_END);
printf
(
"feof(fp)=%d\n"
,
feof
(fp));
//此时在文件结尾处
//即文件最后一个字符(即c字符)的下一个字符处
//结果为0
c =
getc
(fp);
printf
(
"c=%d\n"
,c);
//c=-1
printf
(
"feof(fp)=%d\n"
,
feof
(fp));
//结果为1
return
0;
}
|
c=99
feof(fp)=0
c=-1
feof(fp)=1
本文转自神ge 51CTO博客,原文链接:http://blog.51cto.com/12218412/1888412