[英]Relating efficiency of fgets() function and using >> operator
我正在開發用於從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;
}
這里沒有人能夠給您一個現實的答案。 效率尤其取決於:
使用實際的輸入數據測量目標系統上的效率。 只有這樣,您才能看到有什么更好的方法,以及是否存在根本的區別。
編輯:一個好的開始(可能比任何猜測都更好)將是衡量程序完成所需的時間 。
已知iostream中的格式化輸入>>相當慢。
無論如何,在我看來這不是一個公平的比較: ifstream >> std::string
正在讀取一個由空格分隔的單詞(不是fgets
做什么)。
可能應該使用std::getline
(對於std :: string)或istream::getline
(對於char [])具有相似(盡管不完全相同)的功能。
此外
fgets()最多讀取少於sizeof(buffer)個字符的字符,並在字符串的末尾添加一個空字符 (\\ 0)。 您應該更改fgets(buffer, 28, input);
與fgets(buffer, sizeof(buffer), input);
在使用它之前檢查in
值( 為什么將std :: cout輸出發送到NULL后,它的輸出會完全消失 )。
一些值得深思的:
應該衡量性能,而不是在互聯網上詢問。 測量應用程序的總時間。 如果它“太慢”(無論什么意思),則使用探查器,或添加代碼來測量程序的不同部分,弄清楚它在大部分時間上的花費,然后“修復”。 我可以回答我的機器的功能,但是如果我說,如果在一個ARM開發板上進行測量,該開發板上有一個工作頻率為1000MHz的單核處理器,並且使用的是我在工作中使用的網絡文件系統,它將無法獲得與使用我的計算機相同的結果家用台式機。 瓶頸可能在不同的地方,並且編譯器在不同結構中的效率也可能不同(x86與ARM)。
按照目前的情況,我想說您的第一個代碼是“安全的”,第二個代碼是“不安全的”,這比“更有效”更重要。
char buffer[27];
char *in;
in = fgets (buffer, 28, input);
這將覆蓋緩沖區一個字節,並且如果您不走運(例如,您在buffer
之后立即放置了一些其他數據,並在fgets
和cout << in;
之間將其更新為非零值,則可能會得到(可能很多)垃圾打印,甚至崩潰)。
您的輸入函數還可能根據您的輸入確切地做不同的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.