FILE和fstream的效率测试

针对在前一篇文章中进行代码优化时遇到的文件读写速度问题,本文简单测试了一下C语言中的FILE和C++的fstream的读写效率。

1. FILE

1.1 打开文件

  • 可以使用 fopen( )函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE的一个对象,类型 FILE包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

    1
    FILE *fopen( const char * filename, const char * mode );

    其中,filename指定了需要打开的文件的名字,mode指定了访问模式:

模式描述
r打开一个已有的文本文件,允许读取文件。
w打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+打开一个文本文件,允许读写文件。
w+打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取从文件的开头开始,写入则只能是追加模式。
  • 如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

    1
    "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

1.2 关闭文件

  • fclose( ) 函数提供了关闭文件的功能,函数的原型如下:

    1
    int fclose( FILE *fp );

    如果成功关闭文件,fclose( )函数返回零,如果关闭文件时发生错误,函数返回 EOF

1.3 写入文件

  • fprintf()是常用的文件写入函数,函数原型如下:

    1
    int fprintf(FILE *stream, const char *format, ...);

    这里只比常用的printf()函数多了一个指定文件流对象的参数。

1.4 读取文件

  • 下面的函数允许从流中读取一个字符串:

    1
    char *fgets( char *buf, int n, FILE *fp );

    函数 fgets()从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区buf,并在最后追加一个 null字符来终止字符串。

    如果这个函数在读取最后一个字符之前就遇到一个换行符 ‘\n’ 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。

2. fstream

  • fstreamC++的一个常见的IO标准库,它定义了3个新的数据类型:
数据类型描述
ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream该数据类型表示输入文件流,用于从文件读取信息。
fstream该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream><fstream>

2.1 打开文件

  • 下面是open()函数的标准语法,open()函数是 fstreamifstreamofstream 对象的一个成员:

    1
    void open(const char *filename, ios::openmode mode);

    可以选择的打开模式如下:

模式标志描述
Ios::app追加模式,所有写入都追加到文件末尾。
ios::ate文件打开后定位到文件末尾。
ios::in打开文件用于读取。
ios::out打开文件用于写入。
ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。

2.2 关闭文件

  • 下面是close() 函数的标准语法,close() 函数是 fstreamifstreamofstream 对象的一个成员:

    1
    void close();

2.3 读写文件

  • iostream类似的,这里使用>><<来分别完成文件的读写。

3. 效率比较

  • 首先看看FILE的效率,测试方法写入和读取1千万个数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include<stdio.h>
    #include<time.h>

    int main(){
    clock_t start, finish;
    double runTime;
    start = clock();
    FILE *f_write = fopen("test_file.txt", "w+");
    int i;
    for(i = 0; i < 10000000; ++i){
    fprintf(f_write, "%d\n", i);
    }
    fclose(f_write);
    finish = clock();
    runTime = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("The time to write data using FILE is: %f s\n", runTime);
    //-----------------------------------------------------------
    start = clock();
    char txt[10];
    FILE *f_read = fopen("test_file.txt", "r");
    while(fgets(txt, 10, f_read)){}
    fclose(f_read);
    finish = clock();
    runTime = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("The time to read data using FILE is: %f s\n", runTime);

    return 0;
    }

    运行结果:

    file

  • 接下来测试fstream

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include<iostream>
    #include<fstream>
    #include<time.h>
    using namespace std;

    int main(){
    clock_t start, finish;
    double runTime;
    start = clock();
    ofstream f_write("test_fstream.txt");
    for(int i = 0; i < 10000000; ++i){
    f_write << i << endl;
    }
    f_write.close();
    finish = clock();
    runTime = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("The time to write data using fstream is: %f s\n", runTime);
    //----------------------------------------------------------------
    start = clock();
    char txt[10];
    ifstream f_read("test_fstream.txt");
    while(f_read >> txt){}
    f_read.close();
    finish = clock();
    runTime = (double)(finish - start) / CLOCKS_PER_SEC;
    printf("The time to write data using fstream is: %f s\n", runTime);
    return 0;
    }

    运行结果:

    fstream

  • 对比结果是显而易见的,FILE的读写效率是远好于fstream的,速度竟然相差20倍。所以在对速度要求比较敏感的应用场景中应该优先使用FILE

------------- 本文结束 感谢您的阅读 -------------

本文标题:FILE和fstream的效率测试

文章作者:Perry

发布时间:2019年07月20日 - 23:01

最后更新:2019年09月19日 - 13:46

原始链接:https://perry96.com/archives/f713871c.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%