文本文件读写太慢

UlTMa 2011-03-06 01:02:21
现在用的fstream,要存储矩阵数据,写起来太慢了。因为只读一次就行了,但写操作要很多次,高手指点下,有没有快点的写文本文件方法。试过C语言的FILE + fprintf,速度差不多。

目前读写文本代码大致如下:
ofstream ofs("file.txt");

for (int i=0; i<nrows; i++)
{
for (int j=0; j<ncols; j++)
{
ofs<<mat[i][j]<<" ";
}
ofs<<"\n";
}

因为nrows,ncols比较大,所以很慢。。请各位帮个忙啊
...全文
258 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
UlTMa 2011-03-06
  • 打赏
  • 举报
回复
文本文件,且是double类型,存储确实难以快起来。不过发现<<运算符存储字符要比存储数字快一些。最后,存储double数据时,先格式化成字符串,在存储,速度居然有点提升:

char tmp[15];
double dbl;
ofstream ofs("file.txt");
sprintf_s(tmp, 14, "%.4g ", dbl);
ofs<<tmp;

lazy_2010 2011-03-06
  • 打赏
  • 举报
回复
你不觉得 double 类型的数据,本来就是使用二进制方式最合适么?

使用文本文件,如果文件 size 很大,可以先全部读入内存,然后分析
delphiwcdj 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ultma 的回复:]

引用 5 楼 delphiwcdj 的回复:

试试
C/C++ code

#include <cstdio>
#include <string>
#include <fstream>
using std::string;
using std::fstream;

int main()
{
string str = "aaaaa\nbbbbb";
ofstream ……
[/Quote]
ftoa
UlTMa 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ww884203 的回复:]

感觉这是I/O问题,不是优化程序可以提高的吧。。。
另外我记得写文件飞快的啊。。。。以前我有次程序有点失误,把一条语句反复写入文件。才运行了几秒钟就写了近1G的文件
[/Quote]
就是IO问题吧。文件小的时候很快,感觉不到。文件大了(上百兆甚至几百兆),且不只一个文件时,就显得慢了,感觉拖慢了程序运行了
ww884203 2011-03-06
  • 打赏
  • 举报
回复
感觉这是I/O问题,不是优化程序可以提高的吧。。。
另外我记得写文件飞快的啊。。。。以前我有次程序有点失误,把一条语句反复写入文件。才运行了几秒钟就写了近1G的文件
UlTMa 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 delphiwcdj 的回复:]

试试
C/C++ code

#include <cstdio>
#include <string>
#include <fstream>
using std::string;
using std::fstream;

int main()
{
string str = "aaaaa\nbbbbb";
ofstream ofs("yourfile");
ofs<<st……
[/Quote]
是的,这样速度是快了很多,但怎么把double转换为string啊,这是不是也比较耗时啊??
UlTMa 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 delphiwcdj 的回复:]

for (int i=0; i<nrows; i++)
{
for (int j=0; j<ncols; j++)
{

str.push_pack(mat[i][j]);
}
str.push_back("\n");
}
ofs<<str;
[/Quote]
晕,内容好像都变了。。。变成二进制的了?原来的Mat矩阵变量是double型的,忘了说了。。。
delphiwcdj 2011-03-06
  • 打赏
  • 举报
回复
试试

#include <cstdio>
#include <string>
#include <fstream>
using std::string;
using std::fstream;

int main()
{
string str = "aaaaa\nbbbbb";
ofstream ofs("yourfile");
ofs<<str;
ofs.close();
return 0;
}
delphiwcdj 2011-03-06
  • 打赏
  • 举报
回复
for (int i=0; i<nrows; i++)
{
for (int j=0; j<ncols; j++)
{

str.push_pack(mat[i][j]);
}
str.push_back("\n");
}
ofs<<str;
delphiwcdj 2011-03-06
  • 打赏
  • 举报
回复
先保存到string里,然后再写
UlTMa 2011-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sidyhe 的回复:]

预读到内存,在内存里操作
[/Quote]

不是这样的,所有操作都完了,最后必须输出到文件啊
Sidyhe 2011-03-06
  • 打赏
  • 举报
回复
预读到内存,在内存里操作

64,646

社区成员

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

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