C++里一次读很多到buf中,就是不止一行,是什么函数

chenhaifeng88888 2009-04-19 09:17:49
我有很大的文件,如果每次只读入一行的话,会花费很多时间,
我想一次读入很多在buf中,然后在buf中一次读一行。

C++中每次都很多的函数是什么啊

然后从buf中读入一行是什么函数啊。
谢谢
...全文
281 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhaifeng88888 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ltc_mouse 的回复:]
这个很大,具体可能多大呢?
seek会失败?那试试_seek64系列(名字可能不是这样,查MSDN);而且,如果不同时read,write,没有seek的必要呀,读写之后,文件指针会自动后移的

用read可以一次读指定字节的内容,但没办法指定读多少行~ 即读一大块后,需要自己在内存中处理,一行行提取(有stringstream等可用)
另外,读文件是问题的瓶颈吗?如果不需要经常读,也没必要太在乎吧
[/Quote]


具体多大,就是你想到的最大,几T,或者说更多,就是要考虑极值情况

读文件的内容确实是瓶颈,文件大了,如果每次读写一行,那样读写的时间就大了。磁盘操作要减少。
ltc_mouse 2009-04-19
  • 打赏
  • 举报
回复
这个很大,具体可能多大呢?
seek会失败?那试试_seek64系列(名字可能不是这样,查MSDN);而且,如果不同时read,write,没有seek的必要呀,读写之后,文件指针会自动后移的

用read可以一次读指定字节的内容,但没办法指定读多少行~ 即读一大块后,需要自己在内存中处理,一行行提取(有stringstream等可用)
另外,读文件是问题的瓶颈吗?如果不需要经常读,也没必要太在乎吧
chenhaifeng88888 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lingyin55 的回复:]
用容器,循环把每行保存到容器中
C/C++ code

vector<string> *wlines_of_text = new vector<string>;

ifstream winfile( "a.txt", ios::in );
if ( !winfile )
cout << "Error! cannot open file" <<endl;
string wlineContent;
//用于读取文件的每一行内容
while( getline( winfile, wlineContent, '\n' ) )
wlines_of_text->push_back( wlineContent );


[/Quote]

你这样还是一行一行的读啊
lingyin55 2009-04-19
  • 打赏
  • 举报
回复
用容器,循环把每行保存到容器中

vector<string> *wlines_of_text = new vector<string>;

ifstream winfile( "a.txt", ios::in );
if ( !winfile )
cout << "Error! cannot open file" <<endl;
string wlineContent;
//用于读取文件的每一行内容
while( getline( winfile, wlineContent, '\n' ) )
wlines_of_text->push_back( wlineContent );
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenhaifeng88888 的帖子:]
我有很大的文件,如果每次只读入一行的话,会花费很多时间,
我想一次读入很多在buf中,然后在buf中一次读一行。

C++中每次都很多的函数是什么啊

然后从buf中读入一行是什么函数啊。
谢谢
[/Quote]

做一个够大缓冲区,一次把文件读取到内存。
内存中读取一行,可以根据'\n'符号判断。

或者可以考虑内存文件映射。
  • 打赏
  • 举报
回复
顶4楼~~
恩,用fin.read(内存地址,字节数)读取
chenhaifeng88888 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Loaden 的回复:]
楼上正解。
指定buf大小即可。
其实在Windows下,最好是用API:ReadFile,速度快!
[/Quote]

不仅仅是在Windows下
chenhaifeng88888 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dizuo 的回复:]
C/C++ code
/* fseek example */
#include <stdio.h>

int main ()
{
FILE * pFile;
pFile = fopen ( "example.txt" , "w" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}


After this code is successfully executed, the file example.txt contains:
This is a sample.





[/Quote]
如果文件大了,好像fseek不行
chenhaifeng88888 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 morris88 的回复:]
你是文本文件?
[/Quote]
是文本文件
「已注销」 2009-04-19
  • 打赏
  • 举报
回复
楼上正解。
指定buf大小即可。
其实在Windows下,最好是用API:ReadFile,速度快!
Cpp权哥 2009-04-19
  • 打赏
  • 举报
回复
假设你的文件ifstream对象是fin,一次读取指定个数的字符,可以用fin.read(buf,字节数),用fin.gcount()可以取得成功读取到的字节数。
从buf中再一行一行的读取可以包含头文件sstream,用istringstream bufin(buf);之后再对bufin象用cin那样一行一行读就行了。
fairchild811 2009-04-19
  • 打赏
  • 举报
回复
读入内存中,然后找'\n'或者'\r\n'来区分行与行
morris88 2009-04-19
  • 打赏
  • 举报
回复
试试 fread ...
ryfdizuo 2009-04-19
  • 打赏
  • 举报
回复
/* fseek example */
#include <stdio.h>

int main ()
{
FILE * pFile;
pFile = fopen ( "example.txt" , "w" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}


After this code is successfully executed, the file example.txt contains:
This is a sample.
morris88 2009-04-19
  • 打赏
  • 举报
回复
你是文本文件?
xmrforever 2009-04-19
  • 打赏
  • 举报
回复
mark
liliangbao 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hairetz 的回复:]
引用楼主 chenhaifeng88888 的帖子:
我有很大的文件,如果每次只读入一行的话,会花费很多时间,
我想一次读入很多在buf中,然后在buf中一次读一行。

C++中每次都很多的函数是什么啊

然后从buf中读入一行是什么函数啊。
谢谢


做一个够大缓冲区,一次把文件读取到内存。
内存中读取一行,可以根据'\n'符号判断。

或者可以考虑内存文件映射。
[/Quote]
up
jssz103b 2009-04-19
  • 打赏
  • 举报
回复
getline(ifs,buf,'想要的结束标志符')//可以读取多行buf可以指定大小 也可以是string
zhaohongbo83 2009-04-19
  • 打赏
  • 举报
回复
我个人认为如果是这种情况真的好好考虑一下,如果真的往一个容器了写,如果文件大了肯定会占用很大的内存。
这样应该应该是多个线程,一个线程在读文件,一个线程在处理容器中的数据,
我感觉读文件,打开文件一行一行的读,这里应该不是什么瓶颈问题。

65,211

社区成员

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

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