fscanf,fread,fprintf,fwrite
参考https://blog.csdn.net/godenlove007/article/details/7721647
嘻嘻,由于是边做边学,因此这一篇主要用于解决问题的记录
目录
- fscanf,fread,fprintf,fwrite的区别和联系
- 区别:
- fopen()函数:
- 1.作用:
- 2.函数原型:
- fwrite()函数:
- 1.作用:
- 2.函数原型:
- 3. 注意事项:
- fprintf()函数:
- 1.作用:
- 2.用 法
- 3返回值
fscanf,fread,fprintf,fwrite的区别和联系
需要注意的是文件的输入输出是一对对存在进行使用的,fread与fwrite、fprintf与fscanf
fread(buffer,size,count,fp)
从fp所指 的文件读入一个数据块。size—读入的字节数,count—读入多少个size字节数据, buffer—读入数据存放内存的起始地址。正常返回count的值。
fwrite(buffer,size, count,fp)
fp所指文件写入一个数据块。size—写入的字节数,count—写入多少个size字节数据,buffer—写入数据在内存的首地址。正常返回count 的值。
fprintf(fp, 格式控制串,输出表列)
输出表列中的数据,按格式控制串 的格式写入由fp所指的文件。
fscanf(fp,格式控制串, 输入表列)
由fp所指文件按格式控制串的格式 读入数据,依次赋给输入表列中相应变量
区别:
C语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称为文本(text)文件,它的每个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内在中的存储形式原样输出到磁盘上存放。
fprintf(fp, "%d", buffer); 是将格式化的数据写入文件
fprintf(文件指针,格式字符串,输出表列);
fwrite(&buffer, sizeof(int), 1, fp);是以二进位方式写入文件
fwrite(数据,数据类型大小(字节数),写入数据的最大数量,文件指针);
由于fprintf写入时,对于整数来说,一位占一个字节,比如1,占1个字节;10,占2个字节;100,占3个字节,10000,占5个字节
所以文件的大小会随数据的大小而改变,对大数据空间占用很大。
而fwrite是按二进制写入,所以写入数据所占空间是根据数据类型来确定,比如int的大小为4个字节(一般32位下),那么整数10所占空间为4个字节,100、10000所占空间也是4个字节。所以二进制写入比格式化写入更省空间。
具体将上述区别前,我们还需要搞懂一样东西:
fopen()函数:
1.作用:
在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。
2.函数原型:
-
FILE * fopen(const char * path,const char * mode);
-
-- path: 文件路径,如:"F:\Visual Stdio 2012\test.txt"
-
-- mode: 文件打开方式,例如:
-
"r" 以只读方式打开文件,该文件必须存在。
-
"w" 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
-
"w+" 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
-
"a" 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
-
"a+" 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
-
"wb" 只写打开或新建一个二进制文件,只允许写数据。
-
"wb+" 读写打开或建立一个二进制文件,允许读和写。
-
"ab" 追加打开一个二进制文件,并在文件末尾写数据。
-
"ab+"读写打开一个二进制文件,允许读,或在文件末追加数据。
-
--返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
fwrite()函数:
1.作用:
在C语言中fwrite()函数常用语将一块内存区域中的数据写入到本地文本。
2.函数原型:
-
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
-
-- buffer:指向数据块的指针
-
-- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
-
-- count:数据个数
-
-- stream:文件指针
注意:返回值随着调用格式的不同而不同:
(1) 调用格式:fwrite(buf,sizeof(buf),1,fp);
成功写入返回值为1(即count)
(2)调用格式:fwrite(buf,1,sizeof(buf),fp);
成功写入则返回实际写入的数据个数(单位为Byte)
3. 注意事项:
写完数据后要调用fclose()关闭流,不关闭流的情况下(文件将始终处于打开状态占用内存),每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。
fprintf()函数:
1.作用:
传送格式化输出到一个文件中
2.用 法
#include <stdio.h>
int fprintf( FILE *stream, const char *format, ... );
fprintf()函数根据指定的format(格式)(格式)发送信息(参数)到由stream(流)指定的文件.
3返回值
成功时返回转换的字节数,失败时返回一个负数.
在LINUX/UNIX操系统中成功返回0,失败返回-1。并置errno值.
示例说明:
附上自己之前应用于一个六子棋项目的实例
const char savePath[] = "C6-先手参赛队B vs 后手参赛队W-先手胜 2018.8.2 15;00安徽 2018CCGC.txt";
void DisplayAllSavedGame() {
int cnt = CSaverGame::GetGamesCount(savePath);
char buf[1024];
sprintf(buf, "%d games saved in %s\n", cnt, savePath);
Message(buf);
CSaverGame game;
FOR_EACH(i, cnt) {
game.LoadFromDisk(savePath, i);
sprintf(buf, "%d: %sdraw, %s wins, moves = %d\n", i,
game.IsDraw() ? "" : "not ",
!game.IsDraw() && game.IsBlackWinner() ? "black" : (game.IsDraw() ? "no one" : "white"),
game.GetMovesCount());
Message(buf);
FOR_EACH(k, game.GetMovesCount()) {
CSaverMove m = game.GetMove(k);
sprintf(buf, "%s (%02d, %c)\n", m.IsBlack() ? "B" : "W", m.GetRow(), m.GetCol() + 'A');
Message(buf);
}
Message("\n");
}
}