#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s_readbuf[100];
char *ADP_NET_GetModuleVer_SW() {
FILE *fp = NULL;
int len;
fp = fopen("./version", "r");
if (!fp) {
printf("fopen error\n");
return 0;
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);
fread(s_readbuf, 1, len-1, fp);//len-1 去除换行符
s_readbuf[len] = '\0';
fclose(fp);
fp = NULL;
return s_readbuf;
}
void main() {
char *buf = NULL;
buf = ADP_NET_GetModuleVer_SW();
printf("file content: %s\n", buf);
}
复制代码
(1)函数原形缓存
FILE * fopen(const char * path, const char * mode);bash
(2)参数mode 函数
(4)返回值ui
文件顺利打开后,指向该流的文件指针就会被返回。若是文件打开失败则返回 NULL,并把错误代码存在 error 中。spa
(5)注意事项指针
(1)函数原形code
int fseek(FILE *stream, long offset, int fromwhere);cdn
(2)参数说明blog
第一个参数stream为文件指针 第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移 第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET内存
SEEK_SET: 文件开头 SEEK_CUR: 当前位置 SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之: fseek(fp,100L,0);把stream指针移动到离文件开头100字节处; fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处; fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。
(3)返回值
(4)注意事项
(1)函数原形
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
(2)参数说明
buffer 用于接收数据的内存地址 size 要读的每一个数据项的字节数,单位是字节 count 要读count个数据项,每一个数据项size个字节. stream 输入流
(3)返回值
我的理解为返回数据项数
char *ADP_NET_GetModuleVer_SW() {
FILE *fp = NULL;
int len;
int ret;
fp = fopen("./version", "r");
if (!fp) {
printf("fopen error\n");
return 0;
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
rewind(fp);
ret = fread(s_readbuf, 1, len-1, fp);//len-1 去除换行符
printf("len = %d\n", len);
printf("fread ret = %d\n", ret);
//fread(s_readbuf, len-1, 1, fp);
s_readbuf[len] = '\0';
fclose(fp);
fp = NULL;
return s_readbuf;
}
void main() {
char *buf = NULL;
int ret;
buf = ADP_NET_GetModuleVer_SW();
printf("file content: %s\n", buf);
}
复制代码
运行结果:
len = 28
fread ret = 27
file content: plt-ec20-0.01
plt-ec20-0.02
复制代码
当使用 fread(s_readbuf, 1, len, fp),当len小于fp文件中实际的长度,fread的返回值为len,当len大于fp文件中实际的长度。fread的返回值为文件fp实际的长度。
修改成:ret = fread(s_readbuf, 1, 50, fp);
运行结果:
len = 28
fread ret = 28
file content: plt-ec20-0.01
plt-ec20-0.02
修改成:ret = fread(s_readbuf, 1, 5, fp);
运行结果:
len = 28
fread ret = 5
file content: plt-e
复制代码
当使用 fread(s_readbuf, len, 1, fp),这种语句时,我的理解为读取一个数据项,数据项长度为参数2,当fp文件长度小于len,则说明没有读取完整一个数据项,返回值为0。反之说明已经读取完整一个数据项,返回值为1。
修改成:ret = fread(s_readbuf, 50, 1, fp);
运行结果:
len = 28
fread ret = 0
file content: plt-ec20-0.01
plt-ec20-0.02
修改成:ret = fread(s_readbuf, len, 1, fp);
运行结果:
len = 28
fread ret = 1
file content: plt-ec20-0.01
plt-ec20-0.02
复制代码
(1)函数原形
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
(2)参数说明
(3)返回值
返回实际写入的数据块数目