我正在开发用于从C ++中的文件读取数据的程序。我提出了两种不同的方法来做到这一点。但我不确定哪个是有效的,我甚至不知道如何找到一个程序的效率。我给了你两个片段。请有人告诉我如何分析效率或告诉我哪些是有效的。
ifstream inFile( "Data" );
if( !inFile ){
cerr << "Error :Unable to open the file";
return -1;
}
string word;
while( inFile >> word )
cout << word << endl ;
,另一种方法是:
FILE* input;
input = fopen("/home/jayanarayanan/Project/Data", "rb"); //file input
if ( input == NULL ) { perror (" Error opening File "); }
else{
char buffer[27];
char *in;
in = fgets (buffer, 28, input);
output << in;
}
答案 0 :(得分:2)
这里没有人能够给你一个现实的答案。除其他外,效率取决于:
使用真实的输入数据测量目标系统的效率。只有这样你才能看到更好的东西,以及是否存在相关的差异。
编辑:一个好的开始(可能比任何猜测更好)将衡量你的程序完成所需的时间。
答案 1 :(得分:1)
格式化输入&gt;&gt;众所周知,在iostreams中它很慢。
无论如何,在我看来,这不是一个公平的比较:ifstream >> std::string
正在读一个用空格分隔的单词(而不是fgets
所做的)。
可能你应该使用std::getline
(对于std :: string)或istream::getline
(对于char [])具有相似(但不完全相同)的功能。
此外
fgets()最多读取一个小于sizeof(缓冲区)的字符,将一个空字符(\ 0)添加到字符串的末尾。您应该使用fgets(buffer, 28, input);
fgets(buffer, sizeof(buffer), input);
在使用in
之前检查{{1}}值。{/ p>
有些值得深思的话:
答案 2 :(得分:1)
应衡量绩效,而不是在互联网上询问。衡量申请的总时间。如果它“太慢”(无论这意味着什么),那么使用分析器,或添加代码来衡量程序的不同部分,找出它花费大部分时间的地方,并“修复”。我可以回答我的机器所做的事情,但是如果我测量一个ARM开发板,其中一个核心处理器运行在1000MHz,并且我在工作时使用的网络文件系统,它将不会给出与我使用我的相同的结果。家用台式机。瓶颈可能在不同的地方,编译器在不同结构中的效率也可能不同(x86与ARM)。
目前看来,我会说你的第一个代码是“安全的”,第二个代码是“不安全的”,这是一个比“更有效”更重要的因素
char buffer[27];
char *in;
in = fgets (buffer, 28, input);
这会将缓冲区覆盖一个字节,如果你运气不好(例如你在buffer
后立即放置了一些其他数据,并在fgets
和cout << in;
之间将其更新为非零,那么你可能会得到(很多,可能)垃圾打印,甚至崩溃)。
您的输入功能也可能会执行不同的操作,具体取决于您输入的内容。