码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-07 09:26:01      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://blog.csdn.net/xiamentingtao/article/details/51334570

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!