读书笔记二
——————————————————————————————————————————————————————————————————————————————————————————————————————
文件操作都有什么?
打开方式 | 含义 | 指定文件不存在时 | 指定文件存在时 |
---|---|---|---|
r | 只读方式打开文本文件 | 出错 | 正常打开 |
w | 只写方式打开文本文件 | 建立新文件 | 文件原有内容丢失 |
a | 追加方式打开文本文件 | 建立新文件 | 在原有内容末尾追加 |
r+ | 读/写方式打开文本文件 | 出错 | 正常打开 |
w+ | 读/写方式创建新的文本文件 | 建立新文件 | 文件原有内容丢失 |
a+ | 读/追加方式建立新的文本文件 | 建立新文件 | 在原有内容末尾追加 |
rb | 只读方式打开二进制文件 | 出错 | 正常打开 |
wb | 只写方式打开二进制文件 | 建立新文件 | 文件原有内容丢失 |
ab | 追加方式打开二进制文件 | 建立新文件 | 在原有内容末尾添加 |
rb+ | 读/写方式打开二进制文件 | 出错 | 正常打开 |
wb+ | 读/写方式创建新的二进制文件 | 建立新文件 | 文件原有内容丢失 |
ab+ | 读/追加方式创建新的二进制文件 | 建立新文件 | 在原有内容末尾追加 |
二进制文件和文本文件如何转换?
文本文件与二进制文件:
简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思
- 文本文件转二进制:以文本方式打开读,再以二进制写
- 二进制文件转文本:以二进制方式读,再以文本方式写
知识点的归纳及收获
——————————————————————————————————————————————————————————————————————————————————————————————————————
fread()与fwrite()的用法:
函数原型:size_t fread( void *buffer, size_t size, size_t count, FILE *stream )
- buffer 是读取的数据存放的内存的指针(可以是数组,也可以是新开辟的空间,buffer就是一个索引)
- size 是每次读取的字节数
- count 是读取次数
- strean 是要读取的文件的指针
例如 从文件fp里读取100个字节 可用以下语句:
- fread(buffer,100,1,fp)
- fread(buffer,50,2,fp)
- fread(buffer,1,100,fp)
函数功能
用来读写一个数据块。
一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
注意:
1 完成次写操(fwrite())作后必须关闭流(fclose());
2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;
fgets()与fputs()的用法:
- fgets()函数的第二个参数指明了读入字符的最大数量。如果该参数为n,那么fgets函数将读入n-1个字符。如果fgets()函数读到一个换行符,会把它储存在字符串中。这点与gets不同,gets会丢弃换行符。fgets()函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin作为参数。
- fputs()函数的第二个参数指明他要写入的文件。如果要在计算机显示器上打印,则使用stdout作为参数。与puts()函数不同,fputs()函数不会在待输出字符串末尾添加一个换行符。
fprint()的用法:
fscanf和fprintf的函数原型
int fscanf ( FILE *fp, char * format, ... );
int fprintf ( FILE *fp, char * format, ... );
第一个参数:文件指针
第二个参数:就是格式控制字符串,比如说"%d" 表示十进制输出,"%c"表示单个字符值,%s对应类型为char *, 即字符串(char数组)
第三个参数:表示参数列表
注意:fprintf、fscanf的读写对象不是终端而是磁盘文件
fprintf的用法:
fprintf可以将键盘上输入的一些信息按照指定的格式录入到由指针fp所指向的文件里面
首先我们要定义一个文件指针,格式如下
FILE *fp;
fp = fopen("xinxi.txt", "w+");
分析:
fopen的作用是打开文件,函数原型:FILE * fopen(const char * path,const char * mode);
注意,后面表示打开方式:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
sprintf()的用法:
sprintf函数的格式:
int sprintf( char *buffer, const char *format [, argument,...] );
除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串
常用方式
sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:
例:将”test 1 2”写入数组s中
include<stdio.h>int main(int argc, char *avgv[])
{
char s[40]; sprintf(s,"%s%d%c","test",1,'2');
第一个参数就是指向要写入的那个字符串的指针,剩下的就和printf()一样了
————————————————————————————————————————————————————————————————————————————————————————————————————————————-
相关疑问:
fscanf怎么读取一行信息及跳过换行符读取
fscanf用于从由fp所指向的文件中读取信息
例如:
int i;
fscanf(fp, "%d", &i);
cout<<i;
其中,fscanf(fp, “%d”, &i);表示从文件中读取一个十进制整数,并把它赋值给i
想要读取空格或者换行符的话,只需要把%d换成%c即可
那么如何做到问题所描述的呢?查阅资料得:
读取一行信息
用fscanf读取一整行的信息,我们可以这样写
char str[80];
fscanf(fp, "[^
]", str);
这样一来,str数组就保存了整一行的信息,但是注意,不包括换行符!!
要是想读取完一整行的信息之后直接跳过换行符到下一行,还可以这样写
fscanf(fp, "[^
]%*c", str);
* 表示输入项读入后跳过,所以 %*c 表示跳过一个字符,在此处即是跳过换行符
实践代码链接:
https://gitee.com/zhang_yu_peng/practice-code/blob/master/代码练习.cpp