读书笔记二

读书笔记二

——————————————————————————————————————————————————————————————————————————————————————————————————————

文件操作都有什么?

打开方式 含义 指定文件不存在时 指定文件存在时
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

原文地址:https://www.cnblogs.com/1208499954qzone/p/15310978.html