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

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

fwrite,fread and fprintf,fscanf的一些使用体会的相关文章

文件流:&quot;fopen&quot;,&quot;fclose&quot;,“ftell”&quot;fseek&quot;,&quot;fgets&quot;,&quot;fprintf&quot; ,“feof”,&quot;fwrite&quot;,&quot;fread&quot;

char const* filename="D:/hello.txt"; "fopen", FILE *fp=fopen(char const *name,char const mode); e.g:FILE *fp = fopen(filename,"wb"); 打开文件流,name为要打开文件的路径,如这里的filename:mode 为对文件的操作模式,通常使用:"wb"(写操作),"rb"(读操作)

8.5 文件IO fgets fputs fgetc fwrite fread

fopen函数mode模式: w+不是追加写 是多了一个读权限 文件指针+1没有意义 拷贝一个文件: fgets     fputs   (fgetc同理) int main() { FILE *fp, *fpcp; fp = fopen("yesteday_once_more.txt", "r"); fpcp = fopen("a", "w"); char buf[1024]; //一行给他1024个字节 尽量够用 whil

Linux 打开文件并写入一段字符串,同时读出对应文件的信息--fopen()/fwrite()/fread()

Linux 打开文件并写入一段字符串,同时读出对应文件的信息 在Linux中,采用C语言,使用fopen()函数打开一个文件(若不存在文件,则新建一个 如 data/test.dat),同时采用 fwrite()向其中写入相应的字符串,每次输入写入都换行,最后采用fread()读出相应的信息. 相应的代码如下:Test.c /* Test.c :create a file : Write a string to the file */ #include <stdio.h> #include &

进程操作篇atexit execl exit fprintf fscanf getpid nice get priority printf setpid system vfork wait waitpid

atexit(设置程序正常结束前调用的函数) 相关函数 _exit,exit,on_exit 表头文件 #include<stdlib.h> 定义函数 int atexit (void (*function)(void)); 函数说明 atexit()用来设置一个程序正常结束前调用的函数.当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序. 返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中. 范例 #

Linux 打开文件并写入一段字符串,同一时候读出相应文件的信息--fopen()/fwrite()/fread()

Linux 打开文件并写入一段字符串.同一时候读出相应文件的信息 在Linux中.採用C语言.使用fopen()函数打开一个文件(若不存在文件,则新建一个 如 data/test.dat),同一时候採用 fwrite()向当中写入对应的字符串,每次输入写入都换行,最后採用fread()读出对应的信息. 对应的代码例如以下:Test.c /* Test.c :create a file : Write a string to the file */ #include <stdio.h> #inc

69.fprintf fscanf

fprintf 1 //从读文件中提取字符串到info1.user和info1.password中 2 fscanf(pfr, "%s%s", info1.user, info1.password); fscanf 1 //格式化写入到文件中 2 fprintf(pfw, "%d %s %s\n", i, info1.user, info1.password); 完整代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include &

fwrite &amp; fread 的使用

每一次切换文件操作模式必须调用fclose关闭文件. 如果直接切换操作模式,文件将损坏(出现乱码)或操作失败. 在调用了fclose时,作为参数的文件指针将被回收,必须再次定义,因此最好将功能封装. 存数组时,fwrite参数size_t size可使用sizeof(buffer[0]),size_t count可使用sizeof(buffer)/sizeof(buffer[0]). fread返回了一个整数,是其成功读取的数据数目,最大值是其参数size_t count. 使用循环顺序读取时w

C语言fprintf, fwrite, fscanf, fread混用问题

int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt", "w"); fprintf(fp, "   %d  %d", 3, 5); int x = 4; fwrite(&x, sizeof(int), 1, fp); //    int x = '1'; //    fwrite(&x, sizeo

函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)

函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针): 其中的n是一个正整数.表示从文件中读出的字符串不超过 n-1个字符.在读入的最后一个字符后加上串结束标志'\0'.例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入 字符数组str中. [例10.