在计算行数时从文件读入字符串 C++
Posted
技术标签:
【中文标题】在计算行数时从文件读入字符串 C++【英文标题】:Reading from file into string while counting the lines C++ 【发布时间】:2018-01-28 22:28:04 【问题描述】:我正在尝试将文件读入字符串数组。但是我想这样做,就好像我不知道文档的长度一样。所以我想用一个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::vector。 第二个 for 循环尝试在 eof 之后读取。在运行第二个循环之前,您需要找到文件的开头。 这是一个奇怪的问题。如果性能是任何一种问题,我认为这是因为您似乎不只是想采用明显的解决方案,那么为什么不将整个文件读入一大块然后只记录换行符的位置? 【参考方案1】:每次调用std::geline
(以及<<
运算符和read
方法)都会推进存储在流对象中的输入位置。在第一个while
循环中,您读取了整个文件,因此在此循环之后,输入位置指示器指向文件末尾。
为了在第二个循环中从头开始读取,您必须使用 ifstream::seekg 方法将位置重置回 0。这样您就可以“重新读取”整个文件。
另一方面,正如 cmets 中所指出的,这并不是逐行将文件读入内存的最佳方式。使用std::vector
存储行并将使用getline
读取的行附加到它可能会更好。或者,您可以一次将整个文件读入单个缓冲区并将其拆分为行。
【讨论】:
【参考方案2】:如果您真的只是想获取文件中的行数,那么一次将整个文件读入缓冲区会更有效,然后只需计算其中包含的换行符的数量即可。下面的代码是可以做到这一点的更有效的方法之一。
#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;
【讨论】:
以上是关于在计算行数时从文件读入字符串 C++的主要内容,如果未能解决你的问题,请参考以下文章