如何用fstream提高文件读写的效率

huagong_adu 2010-05-10 12:05:58
我有个文件,一行一个整数,总共有10w个数,也就是10w行,我用ifstream进行读取,然后对这10w个数进行排序,再将排好的这10w个数用ofstream写回文件中,其中读写文件的代码如下:

file1.open("D:\\number.txt",ios::in);
if (!file1)
return -1;
int m = 100000;
int a = 0;
int i = 0;
while (i < m)
{
file1 >> a; //这样效率会不会太低???
//把a放进位图中
i++;
}

i = 0;
file2.open("D:\\result.txt", ios::out);
if (!file2)
return -1;
while (i < n) //遍历位图
{
if (test(i))
{
file2 << i << endl; //这样效率会不会太低???

}
i++;
}


如上面两处读写文件地方注释的,每次读一行做一次操作,或者做一次操作再写一次文件,这样效率太低,怎么样才可以提高效率,减少I/O次数?
...全文
1137 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 huagong_adu 的回复:]
引用 18 楼 zhao4zhong1 的回复:
效率比上面代码更高的恐怕只有用汇编了。


你确定你的这个读写文件的效率比ifstream的高?你的也是一行行读一行行写的吧,这样不是一样要很多次I/O?还有你的qsort的时间复杂度是多少?我的位图是O(n)的,你确定qsort可以在O(n)内做完?
[/Quote]
看不懂汇编的话,你实际运行比较一下时间也行啊。
赵4老师 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 huagong_adu 的回复:]
引用 18 楼 zhao4zhong1 的回复:
效率比上面代码更高的恐怕只有用汇编了。


你确定你的这个读写文件的效率比ifstream的高?你的也是一行行读一行行写的吧,这样不是一样要很多次I/O?还有你的qsort的时间复杂度是多少?我的位图是O(n)的,你确定qsort可以在O(n)内做完?
[/Quote]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
一行行读一行行写对磁盘来说I/O仍然是每簇(通常为32KB)一次!
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
Proteas 2010-05-10
  • 打赏
  • 举报
回复
在 Windows 系统下,直接用内存映射文件读,很快。
白云飘飘飘 2010-05-10
  • 打赏
  • 举报
回复
如果使用i/o stream的话,效率也就是这样,可以考虑改用C的文件操作。和buffer没有关系,因为i/0 stream内部已经使用了buffer
AAA20090987 2010-05-10
  • 打赏
  • 举报
回复
菜鸟来学习一下。。。
huagong_adu 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
每次读入的buffer大一些。


你应该先把文件里的东西读到一个内存的buffer中,然后解析。而不是一个一个从文件里读出来
[/Quote]
你的意思是开一个字符串的buffer,然后再解析这个buffer的数字吗?具体可不可以说明白点?
taodm 2010-05-10
  • 打赏
  • 举报
回复
呃,那就别用fstream,用C标准函数fread等。
wuyu637 2010-05-10
  • 打赏
  • 举报
回复
每次读入的buffer大一些。


你应该先把文件里的东西读到一个内存的buffer中,然后解析。而不是一个一个从文件里读出来
huagong_adu 2010-05-10
  • 打赏
  • 举报
回复
难道就没人精通这个吗?大家交流学习下啊
huagong_adu 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 cyblueboy83 的回复:]
fsteam好像提高不了效率呀
内存映射对大文件也许能提高些效率,可以试试
[/Quote]
内存映射文件怎么用,可以给个例子吗?
huagong_adu 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhao4zhong1 的回复:]
效率比上面代码更高的恐怕只有用汇编了。
[/Quote]

你确定你的这个读写文件的效率比ifstream的高?你的也是一行行读一行行写的吧,这样不是一样要很多次I/O?还有你的qsort的时间复杂度是多少?我的位图是O(n)的,你确定qsort可以在O(n)内做完?
herman~~ 2010-05-10
  • 打赏
  • 举报
回复
fsteam好像提高不了效率呀
内存映射对大文件也许能提高些效率,可以试试
赵4老师 2010-05-10
  • 打赏
  • 举报
回复
效率比上面代码更高的恐怕只有用汇编了。
赵4老师 2010-05-10
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
FILE *f;
int i;
int v;
int n;
int m[100000];
int compare(const void *a,const void *b) {
return (*((int *)a)) - (*((int *)b));
}
int main() {
f=fopen("D:\\number.txt","r");
if (NULL==f) {
printf("Can not find file D:\\number.txt!\n");
return 1;
}
i=0;
while (1) {
if (feof(f)) break;
if (1==fscanf(f,"%d",&v)) {
m[i]=v;
i++;
if (i>=100000) break;
} else {
fscanf(f,"%*c");
}
}
fclose(f);
n=i;
qsort(m, n, sizeof(int), compare);
f=fopen("D:\\result.txt","w");
if (NULL==f) {
printf("Can not create file D:\\result.txt!\n");
return 1;
}
for (i=0;i<n;i++) fprintf(f,"%d\n",m[i]);
fclose(f);
return 0;
}
knop1027 2010-05-10
  • 打赏
  • 举报
回复
学习学习~~~~~~~~~~
赵4老师 2010-05-10
  • 打赏
  • 举报
回复
用纯C
fopen
fread或fscanf
qsort
fwrite或fprintf
fclose
不要用C++

记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
向立天 2010-05-10
  • 打赏
  • 举报
回复
有必要的话可以考虑内存映射文件
knop0211 2010-05-10
  • 打赏
  • 举报
回复
学习学习~~~~~~~~~~
pengzhixi 2010-05-10
  • 打赏
  • 举报
回复
用C标准的I/0函数吧
akonlbjrd 2010-05-10
  • 打赏
  • 举报
回复
用cstdiofile一行一行一行的读保存到vector里面在写回去。。。再用c++标准算法排序。。写回去。。
加载更多回复(4)

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧