现在的位置: 首页 > 综合 > 正文

C++文件读写(一)

2013年05月30日 ⁄ 综合 ⁄ 共 2055字 ⁄ 字号 评论关闭

前几天一直在琢磨C++的文件读取,着实费了不少功夫。一方面是因为需要读取的文件有点大,最少也有接近40W行的数据,加之需要从读进来的字符串转换为浮点型,亦或是将浮点型转换为字符串写如文件,对效率要求就较高了,另一方面则是C++文件读写的方式太多了,纯C的文件IO、C++标准库里的fstream、MFC的文件读写类、Win32 API等,对字符串的处理方式也有很多,比如strtok+atof、sscanf等等。所以要弄清楚这些方法的差异并找到合适的方法,还是需要点时间的。相比之下,之前用c#做文件读写,基本就那么几个类,再不然就得P/Invoke了。

为了不至于过一段时间又忘了,所以在这记录把读写的各种方式记录下来。基本上都只是很浅的知识,但足以应付我最近遇到的读写文件的效率要求,目前37w行的文本数据,在vc2010 debug模式下1.8s完成所有数据的读入并存入相应的vector。初学者需要的话可以看看,大神们请无视之。

好的为了阐述清楚这个问题。先对windows平台下采用C++进行文件读取所有的方法进行一个概览,后面会陆续写续文再逐一详细讨论。

1、Win32 API,核心方法有:CreateFile、OpenFile、ReadFile、WriteFile、SetFilePointer、CloseHandle、CreateFileMapping、MapViewOfFile。

2、C文件流。核心方法有:fopen、fclose、fread、fwrite、fscanf、fprintf、fgets、fputs、fgetc、fputc、fseek、rewind等。

3、C++标准库里的IO部分。核心类有:fstream、ifstream、ofstream。这些类具有getline、read等方法。

4、MFC里的文件IO类。核心类有:CFile、CStdioFile、CFileFinder。

上面基本上就是文件读取所涉及到的所有常用方法和类。从读写的文件类型来说,上面的方法又可分为两类,一类是适宜于读写文本文件的,也就是操作字符串,如fgets、fputs、CStdioFile、ifstream.getline等;另一类是适宜于读写二进制文件的,如CFile、fread、fwrite等。注意,这里说的是适宜,而不是绝对的界限。如fread也可以拿来读取一段字符串。

具体针对这两类文件,在进行读取操作时又要进行不同的处理,总体来说,二进制文件的效率更高,其结构紧凑,并且读取时没有文本文件处理时的换行符和回车符处理,可以直接将数据读进相应的数据类型,唯一麻烦的地方就是Big序和Little序的处理。很多二进制格式的文件里是同时会出现这两种编码顺序的。后面讲二进制文件读写时会专门讲到这两种编码顺序的差别以及处理方法。由于二进制文件的二进制存储特性,使得记事本等工具是无法直接查看内容的,所有很多不开放的文件格式都采用的是二进制。文本文件格式的特点是简单、直观,直接记事本打开就能查看了。但是如果程序需要的不是字符串类型是而其它类型,就需要多出一个将字符串转换为其它数字类型如浮点型的步骤,这往往是读写文本文件时最耗时的部分。并且文本文件数据通常是以行为单位,这就带来了大量的换行符和回车符(注意mac平台和unix平台并不是这样,详细的读者可谷歌这三种平台在换行上的区别),一方面是无故需要多出许多字符,如100W行的数据就需要多出200W个字符,另一方面如果没有采用底层的读写API的话,在换行符和回车符的处理上是会付出一点代价的。

如上所述,二进制文件可以直接将数据读进相应的数据类型,顶多增加一个编码顺序转换的步骤,故这一篇先不详述。下面把读写文本文件时对字符串数据的处理的方法罗列出来。

1、sscanf、sprintf,这两种方法大家都用的挺多了,对字符串里的数据按格式读入相应的数据类型,或将数据按格式写入字符串。

2、strtok+strtok_s+atof(atoi、atol等)。这种方法的思想是先对字符串进行分割,然后再调用字符串转浮点型等方法。

3、strtok+strtok_s+strtod(strtoi、strtol等)。思想同上,只是对字符串到相应数据类型的转换方法族选择不同。

4、对于写数据,除了将相应数据类型转换为字符串外,还需要将字符串连接,可供选择的方法有:strncpy、memcpy、strcat或者自己写一个优化的strcat。

前三种方法都是针对字符串数据处理的,第四种方法是在写文本文件时才会遇到的。

好的。那么这就对windows平台下的文件读写涉及到的东西做了一个大概的介绍,后面会写续文针对涉及到的各种方法分别阐述。由于我最近主要琢磨的也是文本文件的读写,文本文件读写牵涉到的东西也稍微多谢,所以会偏重这一部分的内容。二进制文件也会具体阐述,不过不超过两篇的篇幅。

如果有错误,欢迎指正。毕竟,有些内容我也是查msdn查文档或者谷歌搜的,没有严格的测试过。

抱歉!评论已关闭.