簡體   English   中英

與fgets()函數的效率和使用>>運算符有關

[英]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 [])具有相似(盡管不完全相同)的功能。

此外

一些值得深思的:

應該衡量性能,而不是在互聯網上詢問。 測量應用程序的總時間。 如果它“太慢”(無論什么意思),則使用探查器,或添加代碼來測量程序的不同部分,弄清楚它在大部分時間上的花費,然后“修復”。 我可以回答我的機器的功能,但是如果我說,如果在一個ARM開發板上進行測量,該開發板上有一個工作頻率為1000MHz的單核處理器,並且使用的是我在工作中使用的網絡文件系統,它將無法獲得與使用我的計算機相同的結果家用台式機。 瓶頸可能在不同的地方,並且編譯器在不同結構中的效率也可能不同(x86與ARM)。

按照目前的情況,我想說您的第一個代碼是“安全的”,第二個代碼是“不安全的”,這比“更有效”更重要。

char buffer[27];

char *in;
in = fgets (buffer, 28, input);

這將覆蓋緩沖區一個字節,並且如果您不走運(例如,您在buffer之后立即放置了一些其他數據,並在fgetscout << in;之間將其更新為非零值,則可能會得到(可能很多)垃圾打印,甚至崩潰)。

您的輸入函數還可能根據您的輸入確切地做不同的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM