您的位置:首页 > 其它

fwrite,fread and fprintf,fscanf的一些使用体会

2016-05-06 20:59 531 查看
这周一直在完成一个任务,就是将训练出的多个model写成一个model。其中我们使用了c语言的读写方法,搞了一星期, 挖了很多坑,最终都铲平了。下面列举出若干有用的知识。

1.fwrite,fread VS fprintf,fscanf的区别

fwrite,fread 读写的时候,我发现不管使用FILE* pFile = fopen(“myfile.bin”, “wb”);无论是使用“wb”还是“w”,最后写出的数据均是乱码,所以内容是不可读的。但是安全性好,我们后来就使用fwrite,fread 读写model.而 fprintf,fscanf是可视的。

2. 使用fwrite,fread 读写文件的时候,切记注意变量的格式,举个例子:

#include <stdio.h>
#include <string.h>

int main()
{

FILE * pFile;

pFile = fopen("myfile.bin", "wb");
double  a = 5.1615665161;
fwrite(&a, sizeof(float), 1, pFile);
rewind(pFile);
pFile = fopen("myfile.bin", "rb");
double b ;
fread(&b, sizeof(float), 1, pFile);

return 0;
}


我读入一个double类型数据,但是想以float型写入文件,然后再以float读入,发现读出的数据b是错的。原因在于一个double类型,读入sizeof(float)个字节,会发生截断,所以数据是错误的。应该改为:

#include <stdio.h>
#include <string.h>

int main()
{

FILE * pFile;

pFile = fopen("myfile.bin", "wb");
double  a = 5.1615665161;
float  atemp = a;
fwrite(&atemp, sizeof(float), 1, pFile);
rewind(pFile);
pFile = fopen("myfile.bin", "rb");
double b ;
float btemp;
fread(&btemp, sizeof(float), 1, pFile);
b = btemp;

return 0;
}


也就是必须坚持以原数据的原有格式去读写。

3. 多次打开文件,写数据的方式

一般我们使用:

FILE *fp = NULL;
fp = fopen(saved_file_name.c_str(), "ab");


a即附加的意思。读的时候,如果我们先读入部分数据,再将文件关掉,然后再打开文件,继续读下一行的数据,可以使用

long offset = ftell(fp);


先记下之前读文本的指针位置偏移量,然后下一次打卡文件,将文件指针从头偏移offset量即可。

FILE *fp = fopen(forest_file_name.c_str(), "rb");
fseek(fp, offset, 0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: