簡體   English   中英

從文件讀入字符串,同時計算行數C ++

[英]Reading from file into string while counting the lines C++

我正在嘗試將文件讀入字符串數組。 但是我想做的好像我不知道文檔的長度是多少。 所以我想獲得一個while循環來計數行數,然后再一個循環來閱讀文檔。

當我這樣做時,它可以正常工作,但它假設我知道數組大小的長度是多少。

string count_lines;//dummy string to read the line temp
string votes[11];
string ID[11];
string whole_line[11];
int i = 0;

while (getline(file, count_lines)) 
{
    whole_line[i] = count_lines;
    ID[i].assign(count_lines, 0, 4);
    votes[i].assign(count_lines, 6, 4);
    cout << count_lines << endl;
    i++;
}

但是我試圖做這種變化,但它只打印與我上面打印選項相同功能的空白行

string count_lines;//dummy string to read the line temp
string votes[11];
string ID[11];
string whole_line[11];
int i = 0;

while (getline(file, count_lines)) 
{
    i++;
}

int k = 0;
while (getline(file, count_lines) && k < i) 
{
    whole_line[k] = count_lines;
    ID[k].assign(count_lines, 0, 4);
    votes[k].assign(count_lines, 6, 4);
    cout << count_lines << endl;
    i++;
}

我不確定我在做什么錯。

每次對std::geline調用(以及<<操作符和read方法)都會使存儲在流對象中的輸入位置前進。 在第一個while循環中,您讀取了整個文件,因此在此循環之后,輸入位置指示符指向文件的末尾。 為了從第二個循環的開頭開始讀取,您必須使用ifstream :: seekg方法將位置重置為0。 這樣,您將能夠“重新讀取”​​整個文件。

另一方面,正如評論中指出的那樣,這並不是逐行將文件讀入內存的最佳方法。 最好使用std::vector來存儲行,並將用getline讀取的行附加到該行。 另外,您可以一次將整個文件讀取到一個緩沖區中,然后將其分成幾行。

如果您確實只是想獲取文件中的行數,則將整個文件一次全部讀入緩沖區,然后只計算其中包含的換行符的數量,效率會更高。 以下代碼是可以完成的更有效的方法之一。

#include <vector>
#include <algorithm>
#include <fstream>

int main()
{
    std::ifstream textFile("your_file.txt", std::ios::binary);
    size_t fileSize = textFile.tellg();
    textFile.seekg(0, std::ios::beg);

    std::vector<char> buffer(fileSize);
    size_t numLines(0);

    if (textFile.read(buffer.data(), fileSize))
    {
        numLines = std::count(buffer.begin(), buffer.end(), '\n');
    }
    return 0;
}

暫無
暫無

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

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