2014-11-02 70 views
-3

我只是想使用fstream庫,我想讀一個給定的行。 我想過,但我不知道是否是最有效的方法。閱讀文件的一行C++

#include <iostream> 
#include <fstream> 
using namespace std; 
int main(){ 
    int x; 
    fstream input2; 
    string line; 
    int countLine = 0; 
    input2.open("theinput.txt"); 
    if(input2.is_open()); 
     while(getline(input2,line)){ 
      countLine++; 
      if (countLine==1){ //1 is the lane I want to read. 
       cout<<line<<endl; 
      } 

     } 
    } 

} 

還有別的辦法嗎?

+0

'if(input2。is_open());'是多餘的,有和沒有分號。 – 2014-11-02 10:50:51

+0

哦,謝謝,我從指南中拿出了這部分。我知道我可以刪除,但無論如何謝謝。 – Owenz 2014-11-02 10:54:26

回答

2

這似乎不是最有效的代碼,沒有。

尤其是,您目前正在閱讀整個輸入文件,即使您只關心文件的一行。不幸的是,做好跳繩的工作有點困難。不少人推薦使用如下代碼:

your_stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

...適合這份工作。這可以工作,但有一些缺點。首先,如果您嘗試在非文本文件(特別是不包含換行符)上使用它,它可能會浪費大量的時間讀取整個大文件,在您閱讀足夠多的文件後通常會意識到必須有一個問題。例如,如果你正在閱讀一個「行」,這是一個很好的跡象表明你期望的是一個文本文件,並且你可以很容易地設置第一行可以合理的長度的下限,例如(說)一兆字節,通常比這少很多。

您通常還想檢測它是否停止讀取,因爲它達到了最大值,或者因爲它到達了行尾。只有在達到指定最大值之前遇到換行才跳過「成功」行。要做到這一點,您可以使用gcount()與您指定的最大值進行比較。如果因爲達到指定的最大值而停止讀取,通常希望停止處理該文件(並記錄錯誤,打印出錯誤消息等)。

考慮到這一點,我們可能會這樣編寫代碼:

bool skip_line(std::istream &in) { 
    size_t max = 0xfffff; 

    in.ignore(max, '\n'); 
    return in.gcount() < max; 
} 

根據不同的情況,你可能更願意通過行最大的大小作爲參數(可能有默認值),而不是:

bool skip_line(std::istream &in, size_t max = 0xfffff) { 
    // skip definition of `max`, remainder identical 

有了這個,你可以跳過高達一兆字節默認,但如果你想指定一個不同的最大值,你可以這樣做很容易。

無論哪種方式,與定義,其餘變得相當瑣碎,像這樣:

int main(){ 
    std::ifstream in("theinput.txt"); 

    if (!skip_line(in)) { 
     std::cerr << "Error reading file\n"; 
     return EXIT_FAILURE; 
    } 

    // copy the second line: 
    std::string line; 
    if (std::getline(in, line)) 
     std::cout << line; 
} 

當然,如果你想跳過多行,你能做到這一點很容易,以及由把呼叫skip_line放在一個循環中 - 但請注意,你仍然通常要測試它的結果,如果失敗,則打破循環(並記錄錯誤)。你通常希望是這樣的:

for (int i=0; i<lines_to_skip; i++) 
    skip_line(in); 

有了這個,你會失去的確保您的輸入確實是你所期望的基本優勢之一,而你不產生垃圾。

0

我認爲你可以將你的代碼壓縮到這個。 if (input)足以檢查失敗。

#include <iostream> 
#include <fstream> 
#include <limits> 

int main() 
{ 
    std::ifstream input("file.txt"); 
    int row = 5; 
    int count = 0; 
    if (input) 
    { 
     while (count++ < row) input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     std::string line; 
     std::getline(input, line); 
     std::cout << line; 
    } 
}