fgets()和getline()的效率问题

横云断岭
博客专家认证
2009-12-22 03:41:34
晕,没有插入代码的??
fgets()这个要自己定义大小,但是速度很快?
我打开一个5M的文本,fgets()200ms,getline() 1000ms
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

#include <windows.h>

#pragma comment(lib,"winmm.lib") //timeGetTime()函数用到的库

using namespace std;
int main()
{
ifstream infile;
DWORD start, end;


string filename("c:\\infile1.txt");
//cout << "请输入文件名:(注意要带扩展名的,如data1.txt) ";
//cin >> filename;

infile.open(filename.c_str());
string line;

start = timeGetTime();

while (getline(infile,line))
{

}

end = timeGetTime();

cout<<"time is:"<<end-start<<endl;

infile.close();


FILE *f;
fopen_s(&f,"c:\\infile1.txt","r");

char temp[200];
start=timeGetTime();
while(fgets(temp,180,f))
{
}
end = timeGetTime();
cout<<"time is:"<<end-start<<endl;

return 0;
}


//#include <stdio.h>
//void main()
//{
// int num=0,i=0;//num用于统计单词个数
// char str[100],c;//str[100]用存储输入的字符
// printf("请输入一个字符串:");
// gets(str);//获取输入的字符,存放在str[100]数组中
// do{
// while((c=str[i])==' ')
// i++;//去掉第一个单词前的空格
//
// if(c!='\0')
// num++;//统计单词的个数
//
// while((c=str[i])!=' '&&c!='\0')
// i++;//去掉每个单词之间的空格
// }while(c!='\0');//判断是否为空格
//
// printf("单诩的个数为:%d\n",num);
//
//}
...全文
2120 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
physics1988 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]
C++的流因为要实现异常安全方面的承诺,肯定要远比C的文件操作函数慢。
要快就用C的函数,这个没啥多值得讨论的。
[/Quote]
赞同
pengzhixi 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hengyunabc 的回复:]
引用 8 楼 do_fork 的回复:
标准C的IO,性能一般远远高于标准C++的IO,高一个数量级

那写C++的悲剧了?
[/Quote]

不是这么说的,一般在I/0操作方面是建议使用C库函数的。
横云断岭 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 do_fork 的回复:]
标准C的IO,性能一般远远高于标准C++的IO,高一个数量级
[/Quote]
那写C++的悲剧了?
dskit 2009-12-22
  • 打赏
  • 举报
回复
你自己的实验结果已经说明问题了。
do_fork 2009-12-22
  • 打赏
  • 举报
回复
标准C的IO,性能一般远远高于标准C++的IO,高一个数量级
taodm 2009-12-22
  • 打赏
  • 举报
回复
C++的流因为要实现异常安全方面的承诺,肯定要远比C的文件操作函数慢。
要快就用C的函数,这个没啥多值得讨论的。
横云断岭 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 freezezdj 的回复:]
fgets()200ms,
getline() 1000ms

相对的吧。
你把字符都写一行上让他俩去读,我认为getline() 快。

每个函数都有自己特定的本领。

[/Quote]
这个我把整个文件都读完了。
[Quote=引用 3 楼 pur_e 的回复:]
肯定是fgets的效率高啊,fgets操作的是char *,getline操作的是string,涉及到类的创建、构造函数调用、内存申请、成员数据赋值等问题,效率肯定低的
[/Quote]
string通常只申请一次内存就行了,它申请的内存比要写入的字符数要大。
pur_e 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pur_e 的回复:]
肯定是fgets的效率高啊,fgets操作的是char *,getline操作的是string,涉及到类的创建、构造函数调用、内存申请、成员数据赋值等问题,效率肯定低的
[/Quote]

额,没用到创建,但是内存申请等操作是少不了的
冻结 2009-12-22
  • 打赏
  • 举报
回复
fgets()200ms,
getline() 1000ms

相对的吧。
你把字符都写一行上让他俩去读,我认为getline() 快。

每个函数都有自己特定的本领。
pur_e 2009-12-22
  • 打赏
  • 举报
回复
肯定是fgets的效率高啊,fgets操作的是char *,getline操作的是string,涉及到类的创建、构造函数调用、内存申请、成员数据赋值等问题,效率肯定低的
横云断岭 2009-12-22
  • 打赏
  • 举报
回复
晕,用chome,看不上面的工具条。。

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

#include <windows.h>

#pragma comment(lib,"winmm.lib") //timeGetTime()函数用到的库

using namespace std;
int main()
{
ifstream infile;
DWORD start, end;


string filename("c:\\infile1.txt");
//cout << "请输入文件名:(注意要带扩展名的,如data1.txt) ";
//cin >> filename;

infile.open(filename.c_str());
string line;

start = timeGetTime();

while (getline(infile,line))
{

}

end = timeGetTime();

cout<<"time is:"<<end-start<<endl;

infile.close();


FILE *f;
fopen_s(&f,"c:\\infile1.txt","r");

char temp[200];
start=timeGetTime();
while(fgets(temp,180,f))
{
}
end = timeGetTime();
cout<<"time is:"<<end-start<<endl;

return 0;
}

li32768 2009-12-22
  • 打赏
  • 举报
回复
fgets 可以从标准输入也就是键盘获得输入

65,190

社区成员

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

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