C++文件读写操作及加速

01 文件读写方法


使用C中的freopen()函数进行打开文件并重定向输入输出。如下:

#include<iostream>
using namespace std;
int main()
{
    freopen("testfile.txt","w",stdout);

    for(int i=0;i<10;i++)
        cout<<i<<" ";
    return 0;
}

 这样,你就可以使用普通的cin,cout来进行文件的输入输出了,当然你也可以使用printf()等函数。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    freopen("testfile.txt","w",stdout);

    for(int i=0;i<10;i++)
        printf("%d",i);
    return 0;
}

输出结果应该为0-9的一行数字。

其中,freopen()的第一个参数为(文件路径+)文件名(,即文件所在的相对路径或绝对路径)。第二个参数为描述符:常用的有r(read,读)、w(write,写)等。第三个参数为被重定向的流一般有stdin,stdout和stderr。

下面,就来详解一下这三个参数。

10 freopen()参数的说明


1-char *FileName

第一个参数填文件名。平时做题或者比赛时,因为数据基本上都会和程序放在一块,所以直接写文件名即可。程序会读取同目录下的对应文件。

而你如果把数据放在了子文件夹"SubDir"中,那么就应该使用相对路径,即相对当前目录的位置。例如:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    freopen("SubDir/testfile.txt","w",stdout);

    for(int i=0;i<10;i++)
        printf("%d",i);
    return 0;
}

但是,如果你的数据放在了父级目录呢?

那就使用绝对路径。即相对与你盘符(或者说根目录?)的路径。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    freopen("C:\\Users\\Administrator\\Desktop\\testfile.txt","w",stdout);

    for(int i=0;i<10;i++)
        printf("%d",i);
    return 0;
}

注意,Windows平台下,文件路径使用的是反斜杠"\"。而编译器会理所当然地把你的"\"当成是在转义——所以,你要转义你的"\"。也就是使用双反斜杠"\\"。

2-char *RestrictMode

这个没什么好说的,一般只用读写足矣。

r(read,读)、w(write,写)

3-char *RestrictStream

重定向至的流。

一般使用输入输出流,即使用stdin(输入)、stdout(输出)。

stderr是标准错误输出设备流。在默认情况的下,stdout会缓冲——只有当换行的时候,缓冲中的内容才会输出到你的屏幕。

而stderr则是没有缓冲的,会直接输出。在你想读写文件时,请不要用stderr。它会直接输出到你的屏幕上(输出错误信息用的)。也就是你程序的运行界面。

当然,这玩意几乎用不到。

11 文件读写的加速


文件读写加速的方法也很简单。

1-在一开始关闭同步流加速

使用以下方法:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    freopen("testfile.txt","w",stdout);
    ios::sync_with_stdio(false);
    for(int i=0;i<100;i++)
        printf("%d",i);
    return 0;
}

加一行码,即把同步流设置成false。注意,一定要在一开始加!否则你都输出完了还关啥......

把输出改为输出一万个数(0-9999),看看加了和不加的区别如何:

Process returned 0 (0x0)   execution time : 0.455 s
---------------------------------------------------
Process returned 0 (0x0)   execution time : 0.428 s

上面是没加的,下面是加了的。

经过多次试验可以发现,关了同步流比没关大概要快0.03秒左右。如果数据更大,那么时间差也会更大。

2-使用"\n"换行

换行时,你可能会使用endl。推荐使用换行符换行——只不过需要注意平台差异,Windows和Linux的换行符似乎不一样。

同样地,我们来对比一下用时:

A组:

#include<iostream>
using namespace std;
int main()
{
    freopen("testfile.txt","w",stdout);
    ios::sync_with_stdio(false);
    for(int i=0;i<10000;i++)
        cout<<i<<endl;
    return 0;
}

B组:

#include<iostream>
using namespace std;
int main()
{
    freopen("testfile.txt","w",stdout);
    ios::sync_with_stdio(false);
    for(int i=0;i<10000;i++)
        cout<<i<<"\n";
    return 0;
}

用时对比:

Process returned 0 (0x0)   execution time : 0.551 s // A组
---------------------------------------------------
Process returned 0 (0x0)   execution time : 0.440 s // B组

 可以明显地看到,使用换行符"\n"会快很多。

(tips:这些加速也是基本的卡常知识哦)

上一篇:磁盘性能分析


下一篇:natapp内网穿透