C++文件读写操作及加速
2022/1/30 1:07:59
本文主要是介绍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:这些加速也是基本的卡常知识哦)
这篇关于C++文件读写操作及加速的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享