C++里面的文件处理方法

  • 2019 年 11 月 6 日
  • 筆記

C++里面的文件处理方法

01 文件的fopen函数和fprintf函数 今天在对一些待审核SQL进行语法解析的时候,使用到了C++编程语言,从毕业开始,好久没有动过C++了,工作后一致沉迷在Python的简洁方便中无法自拔。今天有一个打印语法树的需求,想用C++实现一把,所以就回忆了一下C++里面将内容打印到文件的方法,但是在实现的时候,还是摆脱不了C语言的影响,今天先给出C风格完整的代码,后续补充上C++里面的标准输入输出流的代码,算是一个小的总结吧。

1.将特定的字符串写入到一个文件中(C风格):

#include "stdafx.h"  #include "string"  #include "iostream"  #include "stdio.h"  using namespace std;    int file_write(const char* tempstr)  {      FILE *fp;      int i;        fp = fopen("E:/file/data.txt", "w");      if (fp == NULL)      {          printf("File cannot open! ");          exit();      }        char d[];      sprintf(d,"%s", tempstr);      fprintf(fp, "%st", d);      printf("writted!n");        fclose(fp);      return ;  }    int main()  {      const char* tempstr = "hello,world";      file_write(tempstr);      return ;  }  

上面的代码中,file_write是一个函数,它接受一个常量指针,然后将这个值打印到一个data.txt的文件中。这里对代码中的一些小的点进行解释:

FILE* fp是一个FILE类型的指针变量;

sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中,sprintf是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性,它的返回值是写入的字符数,如果写入"hello,world",则返回值是11;

fprintf和sprintf类似,不过fprintf是写入到一个文件中。

关于fopen函数后面跟的文件操作类型,这里给出一个表格:

关于文件的使用方法,还有如下几点需要注意:

对于文件使用方式有以下几点说明:

1) 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:

r(read): 只读

w(write): 只写

a(append): 追加

t(text): 文本文件,可省略不写

b(binary): 二进制文件

+: 读和写

2) 凡用“r”打开一个文件时,该文件必须已经存在,且只能从该文件读出。

3) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。如果指定文件不存在则尝试创建该文件。

5) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:

当我在vs2015中对上面的代码进行编译的时候,碰到了下面这个小问题,这里贴出来大家了解下:

'fopen': This function or variable may be unsafe.  Consider using fopen_s instead. To disable deprecation,  use _CRT_SECURE_NO_WARNINGS. See online help for details.  file_operation      d:program files (x86)myprojectfile_operationfile_operation.cpp    15    

这个错误是说fopen函数不安全,如果想要使用的话,请在预处理器中添加_CRT_SECURE_NO_WARNINGS来回避。

02

文件读取fread和fwrite函数

文件读取和文件写入类似,这里也给出一段代码,来介绍文件的读取方法,具体代码如下:

int file_read_and_write()  {      FILE*stream;      char msg[] = "this is a test";      char buf[];      if ((stream = fopen("E:/file/data.txt", "w+")) == NULL)      {          fprintf(stderr, "Can not open output file.n");          return ;      }      /*write some data to the file*/      fwrite(msg, , strlen(msg) + , stream);      /*sizeof(char)=1 seek to the beginning of the file*/      fseek(stream, , SEEK_SET);      /*read the data and display it*/      fread(buf, , strlen(msg) + , stream);        printf("%sn",buf);      fclose(stream);      return ;  }      int main()  {      const char* tempstr = "hello,world";      file_read_and_write();      return ;  }  

上面的例子首先打开文件data.txt,然后写入this is a test这个测试字符串,将文件指针设置到文件头,然后读取文件里面的内容,这里再解释下fread和fwrite函数:

fread()函数:

fread是一个函数,它从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0

buffer:用于接收数据的内存地址

size:要读的每个数据项的字节数,单位是字节

count要读count个数据项,每个数据项size个字节.

stream:输入流

返回值:返回真实读取的项数,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。

fwrite()函数:

fwrite() 是 C 语言标准库中的一个文件处理函数,功能是向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。该函数以二进制形式对文件进行操作,不局限于文本文件。

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

返回值:返回实际写入的数据块数目

(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;

(2)size:要写入内容的单字节数;

(3)count:要进行写入size字节的数据项的个数;

(4)stream:目标文件指针;

(5)返回实际写入的数据项个数count。

输出结果如下: