我正在尝试将文件读入字符串数组。但我想这样做,好像我不知道文件的长度是多少。所以我想得到一个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++;
}
我不确定我做错了什么。
答案 0 :(得分:1)
每次调用std::geline
(以及<<
运算符和read
方法)都会提升存储在流对象中的输入位置。在第一个while
循环中,您读取整个文件,因此在此循环之后,输入位置指示符指向文件的末尾。
要在第二个循环中从头开始读取,必须使用ifstream::seekg方法将位置重置为0。通过这种方式,您可以重新阅读&#34;整个文件。
另一方面,正如评论中所指出的,这并不是逐行将文件读入内存的最佳方式。使用std::vector
存储行并将getline
读取的行附加到其中可能会更好。或者,您可以将整个文件一次读入单个缓冲区并将其拆分为行。
答案 1 :(得分:0)
如果您真的想要获取文件中的行数,那么将整个文件一次性读入缓冲区的效率要高得多,那么只需计算其中包含的换行符数。以下代码是更有效的方法之一。
#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;
}