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

来源:互联网 发布:圆点博士 源码 编辑:程序博客网 时间:2024/06/05 17:42

这周一直在完成一个任务,就是将训练出的多个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);
0 0
原创粉丝点击