[英]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.